私の単体テストでは、DataAnnotationsが含まれているコードファーストPOCOの検証を強制したいと思います。
MVCフレームワークは舞台裏でそれを行っているに違いありませんが、基本的にはその方法を知りたいので、うまくいけばそれを利用することができます。
私の単体テストでは、DataAnnotationsが含まれているコードファーストPOCOの検証を強制したいと思います。
MVCフレームワークは舞台裏でそれを行っているに違いありませんが、基本的にはその方法を知りたいので、うまくいけばそれを利用することができます。
MVCフレームワークは舞台裏でそれを実行しているので、基本的にはその方法を知りたいので、うまくいけばそれを利用することができます。
リクエスト値からモデルをバインドした後、モデルの検証を呼び出すのは、デフォルトのモデルバインダーです。
を使用して、検証プロセスを手動で呼び出すことができますValidationContext
。
モデルがあるとしましょう。
public class Foo
{
[Required(ErrorMessage = "the Bar is absolutely required")]
public string Bar { get; set; }
}
そして、それをユニットテストすることができます:
[TestMethod]
public void The_Bar_Is_Required()
{
// arrange
var foo = new Foo();
var results = new List<ValidationResult>();
var context = new ValidationContext(foo, null, null);
// act
var actual = Validator.TryValidateObject(foo, context, results);
// assert
Assert.IsFalse(actual);
}
DataAnnotationsを使用する代わりに、FluentValidation.NETを使用してビューモデルの検証を実行することもできます。ASP.NET MVCとうまく統合され、非常にエレガントな方法でバリデーターの単体テストを行うことができます。
私はちょうど同様の質問に答えました。
私は通常、System.ComponentModel.DataAnnotations.Validatorのファサードメソッドを直接呼び出すことにより、モデル検証セットアップを単体テストします。
このテーマに関する記事を書きましたhttp://timoch.com/blog/2013/06/unit-testing-model-validation-with-mvcs-dataannotations/
私はこのようなコードになります(この記事は、モデル検証のためのよりクリーンで再利用可能な単体テストの基本クラスを示しています)
[Test]
[TestCaseSource("ValidationRule_Source")]
public void ValidationRule(ValidateRuleSpec spec) {
// Arrange
var model = CreateValidPersonModel();
// Apply bad valud
model.GetType().GetProperty(spec.MemberName).SetValue(model, spec.BadValue);
// Act
var validationResults = new List<ValidationResult>();
var success = Validator.TryValidateObject(model, new ValidationContext(model), validationResults, true);
// Assert
Expect(success, False);
Expect(validationResults.Count, EqualTo(1));
Expect(validationResults.SingleOrDefault(r => r.MemberNames.Contains(spec.MemberName)), Not.Null);
}
public IEnumerable<ValidateRuleSpec> ValidationRule_Source() {
yield return new ValidateRuleSpec() {
BadValue = null,
MemberName = "FirstName"
};
yield return new ValidateRuleSpec() {
BadValue = string.Empty,
MemberName = "FirstName"
};
yield return new ValidateRuleSpec() {
BadValue = null,
MemberName = "LastName"
};
/* ... */
}
コードが機能することを信頼するのは好きではないので、モデル検証コードの単体テストを体系的に記述します。ただし、検証を実行するためにフレームワーク/モデルバインダーを信頼しています。この単体テストにより、検証がOKであると信頼するコントローラーを作成できます。