Тестирование кода с проверкой ReCaptcha в контроллере?
Вот мой упрощенный контроллер:
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
if (!ReCaptcha.Validate(Constants.ReCaptchaPrivateKey))
ModelState.AddModelError("recaptcha", "Incorrect value, enter the text again.");
if (ModelState.IsValid)
{
//Code for register
}
}
Где должна быть проверена логика проверки данных?
1 ответ:
Я бы создал интерфейс для проверки ReCaptcha, или для того, что это представляет, что на самом деле является человеческой проверкой, так что что-то вроде:
public interface IHumanValidator { ///Checks validates that the currentuser is human and not a bot bool Validate(); /// Returns the text to display if the validation fails string ValidationFailText{get;} }
Вам нужно будет изменить контроллер, чтобы принять
IHumanValidator
в конструкторе (или свойство, если это необходимо). Затем измените свой метод на:[HttpPost] [ValidateAntiForgeryToken] public ActionResult Register(RegisterModel model) { if (!m_humanValidator.Validate()) ModelState.AddModelError("recaptcha", m_humanValidator.ValidationFailText); if (ModelState.IsValid) { //Code for register } }
Затем я бы ввел реализацию, которая основана на проверке ReCaptcha в контроллер и проверил бы против этого:
public class ReCaptchaHumanValidator : IHumanValidator { public bool Validate() { ReCaptcha.Validate(Constants.ReCaptchaPrivateKey) } public string ValidationFailText { get{return "Incorrect value, enter the text again.";} } }
Тогда вы могли бы ввести МОК валидатор для тестирования, который можно настроить так, чтобы он возвращал валидность или нет в зависимости от теста.
Это также имеет то преимущество, что если вы решили перейти на другую форму проверки, а не ReCaptcha, то вам нужно только предоставить другую реализацию IHumanValidator и не нужно ничего менять в вашем коде.