Тестирование кода с проверкой reCAPTCHA в контроллере?

#unit-testing #architecture #tdd #recaptcha #mvcrecaptcha

#модульное тестирование #архитектура #tdd #recaptcha #mvcrecaptcha

Вопрос:

Вот мой упрощенный контроллер:

 [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 и больше ничего не менять в своем коде.