2

ここで私の単純化されたコントローラー:

[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 
    }
}

データ検証ロジックはどこでテストする必要がありますか?

4

1 に答える 1

0

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の別の実装を提供するだけでよく、コード内の他の何も変更する必要がないという利点もあります。

于 2011-10-11T08:07:28.057 に答える