1

wcfサービス用にセットアップした検証をテストしようとしています。それを行うための最良の方法は何ですか?

[ServiceContract]
[ValidationBehavior]
public interface IXmlSchemaService
{

    [OperationContract(Action = "SubmitSchema")]
    [return: MessageParameter(Name = "SubmitSchemaReturn")]
    [FaultContract(typeof(ValidationFault))]
    JobData SubmitSchema([XmlStringValidator] string xmlString);
}

XmlStringValidatorは、私が作成したカスタムバリデーターです。理想的には、次のようなものが必要です。

XmlSchemaService service = new XmlSchemaService();
service.SubmitSchema();

ただし、この場合、検証は呼び出されません。

4

2 に答える 2

2

定義上、この種のテストは統合テストであり、単体テストではありません。VAB検証は、サービス操作がWCFパイプラインを介して呼び出された場合にのみ実行されます。

クライアントプロキシを作成せずにWCFパイプラインを介して呼び出しを強制することもできますが、クライアントがサービスから公開したい障害を正確に認識していることを確認するために、クライアントプロキシからこれをテストする方が理にかなっています。検証が失敗したとき?

于 2010-08-02T17:42:15.823 に答える
1

検証を個別にテストできます。サービスコードを直接実行するときに検証を呼び出すことはできませんが、検証アプリケーションブロックには、コードをテストするための2つの方法があります(私が知っていることです)。

  1. ValidatorFactoryを使用して入力タイプのバリデーターを作成し、検証結果に予想されるエラーが含まれていることを表明します。
  2. バリデーターを直接インスタンス化し、さまざまな入力でテストします。

実際には、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章-検証の複雑さの排除

于 2012-07-25T15:21:14.737 に答える