1

単体テストのベスト プラクティスに取り組もうとしていますが、理解できない問題に遭遇しました。本番コードには、次のように、特定のオブジェクトを別のオブジェクトに変換する関数があります。

元のオブジェクト:

public OriginalObject
{
    public string Id {get; set;}
    public string Value {get; set;}
    public int FormCode {get; set;}
    public int NameCode {get; set;}
    //other properties
}

public TransformedObject
{
    public string Value {get; set;}
    public int FormCode {get; set;}
    //other properties
}

変換機能:

public TransformedObject Transform(OriginalObject originalObject)
{
    var TransformedObject = new TransformedObject();
    TransformedObject.Value = originalObject.Value;
    TransformedObject.FormCode = originalObject.FormCode;
    return TransformedObject;
}

テストは次のようになります。

[Test]
public void Transform_NonNullOptionObject_ValuePropertyIsTheSame()
{
    OptionObjectTransform transform = InitTransform();
    CustomOptionObject result = transform.Transform(optionObject);//mock optionObject
    Assert.AreEqual(optionObject.Value, result.Value);
}

私の質問は、プロパティごとにテストを作成する必要があるかどうかです。または、[TestCase]テストしたいプロパティを渡すために を使用する方法はありますか? または、テストですべてのプロパティが等しいかどうかを確認する必要がありますか? テストが失敗した場合、どのプロパティが一致しないかがわからないため、最後のものは解決策ではないと思います。

4

2 に答える 2

0

NUnit (および他のすべての xUnit フレームワーク) の制限は、最初のアサートの失敗で失敗し、他のアサートを実行しないことです。あなたが言うように、これは、多くのアサートを通じて多くの値をテストしようとすると、複数の失敗を検出する方法がないことを意味します。

ただし、NUnitの制限を回避するためだけに、多くの重複したコードが含まれるため、それぞれが異なる値をテストする多くの繰り返しテストも理想的ではありません。

「両方の長所を生かした」ソリューションは、オブジェクトの配列が等しいかどうかをテストすることです。これは、次の形式を取ることができます。

[Test]
public void Transform_NonNullOptionObject_ValuePropertyIsTheSame()
{
    OptionObjectTransform transform = InitTransform();
    CustomOptionObject result = transform.Transform(optionObject);
    var expected = new[] { optionObject.Value, optionObject.FormCode };
    var actual = new[] { result.Value, result.FormCode };
    Assert.AreEqual(expected, actual);
}

そうすれば、1 回のテストで多くの値をテストし、多くの失敗を同時に知ることができます。

于 2013-10-25T15:50:30.600 に答える
0

単純なマッピング (つまり、計算されたマッピングまたは「if」がほとんどない場合) には、すべての間違ったアサーションを報告するナイスアサーションがあるSharpTestExを使用します。Satisfy

コードは次のようになります。

mapped.Satisfy( m =>
    m.Prop1 == source.SomeData + "zz" &&
    m.Prop2 == source.Prop2 ...
);
于 2013-10-25T19:32:20.580 に答える