検証を個別にテストできます。サービスコードを直接実行するときに検証を呼び出すことはできませんが、検証アプリケーションブロックには、コードをテストするための2つの方法があります(私が知っていることです)。
- ValidatorFactoryを使用して入力タイプのバリデーターを作成し、検証結果に予想されるエラーが含まれていることを表明します。
- バリデーターを直接インスタンス化し、さまざまな入力でテストします。
実際には、2つの手法を組み合わせて使用することになります。方法1を使用して、複雑な入力タイプの検証エラーをテストします。例として:
[DataContract]
public class Product
{
[DataMember, NotNullValidator]
public string Name { get; set; }
[DataMember, RangeValidator(0.0, RangeBoundaryType.Exclusive,
double.MaxValue, RangeBoundaryType.Ignore,
ErrorMessage = "The value cannot be less than 0.")]
public double Price { get; set; }
}
[TestMethod]
public void InvalidProduct_ReturnsValidationErrors()
{
Product request = new Product()
{
Price = -10.0
};
var validatorFactory = EnterpriseLibraryContainer.Current
.GetInstance<ValidatorFactory>();
var validator = validatorFactory.CreateValidator<Product>();
var results = validator.Validate(request);
Assert.IsTrue(results.Any(vr => vr.Key == "Name"
&& vr.Message == "The value cannot be null."));
Assert.IsTrue(results.Any(vr => vr.Key == "Price"
&& vr.Message == "The value cannot be less than 0."));
}
方法2の場合、作成したバリデーターのユースケースシナリオをカバーするテストがあります。別の例として:
[TestMethod]
public void XmlStringValidator_ReturnsErrors_OnInvalidInput()
{
var validator = new XmlStringValidator();
var results = validator.Validate("Your input goes here");
Assert.IsTrue(results.Any(vr => vr.Key == "[KeyNameInValidator]" &&
vr.Message == "[Expected error message based on input]"));
}
方法2では、XmlStringValidatorに必要な数のテストシナリオを作成できます。
これらの方法の詳細については、次の記事を参照してください。第6章-検証の複雑さの排除