我会创建一个用于 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
构造函数中的 an (如果必须,则为属性)。然后将您的方法更改为:
[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 的另一个实现,并且不需要更改代码中的任何其他内容。