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