0

アプリケーションの単体テストを支援するためにNDbUnitを使用することを検討しています。質問のタイトルにあるように、NDbUnitのテストデータを別々のXMLファイルに保存できるかどうか疑問に思っています。私の単一のテストデータXMLファイルは非常に大きく、さらにいくつかのエンティティを追加すると管理できなくなる可能性があることにすでに気づきました。

さて、この質問を読んだら、それは不可能のように見えますが、私は確信したいと思います。

それが役立つ場合、これは問題を説明するサンプルコードです。アイデアは、プログラムがベンダーに関連付けられているということです。3つのベンダーを含むテストデータを設定しました。2番目のベンダーには3つのプログラムがあります。TestData.xmlには、すべてのベンダーとプログラムのすべてのテストデータが含まれています。私がそれを使うとき、ユニットテストは期待通りに合格します。複数の呼び出しを使用して個々のXMLファイルを個別に読み取ろうとするとdb.PerformDbOperation(DbOperationFlag.CleanInsertIdentity);、2番目の呼び出しが最初の呼び出しで行われたことを上書きするように見えます。

private const string xmlSchema = @"..\..\schema.xsd";
// All of the test data in one file.
private const string xmlData = @"..\..\XML Data\TestData.xml";
// Individual test data files.
private const string vendorData = @"..\..\XML Data\Vendor_TestData.xml";
private const string programData = @"..\..\XML Data\Program_TestData.xml";

public void WorkingExampleTest()
{
    INDbUnitTest db = new SqlDbUnitTest(connectionString);
    db.ReadXmlSchema(xmlSchema);
    db.ReadXml(xmlData);
    db.PerformDbOperation(DbOperationFlag.CleanInsertIdentity);

    VendorCollection vendors = VendorController.List();
    Assert.IsNotNull(vendors);

    ProgramCollection collection = VendorController.GetPrograms(vendors[1].VendorID);
    Assert.IsNotNull(collection);
    Assert.IsTrue(collection.Count == 3);
}

public void NotWorkingExampleTest()
{
    INDbUnitTest db = new SqlDbUnitTest(connectionString);
    db.ReadXmlSchema(xmlSchema);
    db.ReadXml(vendorData);
    db.PerformDbOperation(DbOperationFlag.CleanInsertIdentity);

    db.ReadXml(programData);
    db.PerformDbOperation(DbOperationFlag.CleanInsertIdentity);

    VendorCollection vendors = VendorController.List();
    Assert.IsNotNull(vendors);

    // This line throws an ArgumentOutOfRangeException because there are no vendors in the collection.
    ProgramCollection collection = VendorController.GetPrograms(vendors[1].VendorID);
    Assert.IsNotNull(collection);
    Assert.IsTrue(collection.Count == 3);
}

これは機能します:

4

1 に答える 1

1

使用しているDbOperationFlag値の意味に注意してください。「CleanInsertIdentity」の「Clean」部分は、「プロセスの挿入ID部分を実行する前に既存のレコードをクリーンアップする」ことを意味します。

可能な列挙値の詳細については、http://code.google.com/p/ndbunit/source/browse/trunk/NDbUnit.Core/DbOperationFlag.cs​​を参照してください。

InsertまたはInsertIdentityのいずれかを使用して同じプロセスを試して、目的を達成できるかどうかを確認できますが、設計上、 CleanInsertIdentityはこのシナリオでは機能しません:)

于 2011-05-21T16:59:00.383 に答える