1

mstest を使用して以下のテストを作成しました。約 20 行の Excel シートがあり、テストは行ごとに 1 回実行され、TestContext の DataRow プロパティにはその行のデータが入力されます。TestContext オブジェクトが PopulateCustomerViaDataSource メソッドに渡され、顧客オブジェクトに Excel シートから顧客の詳細が取り込まれます。次に、顧客オブジェクトが Web メソッドに渡されて、詳細が別のアプリケーションにインポートされます。基本的に、特定のテスト実行のすべてのデータは、1 つのオブジェクト、つまり TestContext を使用してアクセスできます。これは、テストに渡す必要さえありません。そのため、たとえば Customer オブジェクトを設定することは非常に簡単です。

[DataSource("System.Data.Odbc", "Dsn=Excel Files;Driver={Microsoft Excel Driver (*.xls)};dbq=|DataDirectory|\\Data.xls;defaultdir=.;driverid=790;maxbuffersize=2048;pagetimeout=5;readonly=true", "ApVendorImportCreate$", DataAccessMethod.Sequential), TestMethod]
public void CustomerImport_CreateVendor()
{
    Customer customer = CustomerImportHelpers.PopulateCustomerViaDataSource(TestContext);
    Result result;

    using (SomeWebService client = new SomeWebService())
    {
        result = client.CustomerImport(customer);
    }

    Assert.IsTrue(result.Success, "Customer import was unsuccessful.  Returned error message was \"" + result.Message + "\"");
    AssertCustomerInfoSavedCorrectly(customer);
}

私の質問は、xUnit を使用してこれと同様の結果を得るにはどうすればよいかということです。しばらく試してみましたが、うまくいきませんでした。グーグルで検索しましたが、これを具体的に示す記事/投稿を見つけることができませんでした。xUnit のデータ駆動型のスタッフについて私が見つけたすべての記事では、以下のようにパラメーターが個別に渡されます。

public class StringTests3
{
    [Theory, ClassData(typeof(IndexOfData))]
    public void IndexOf(string input, char letter, int expected)
    {
        var actual = input.IndexOf(letter);
        Assert.Equal(expected, actual);
    }
}

public class IndexOfData : IEnumerable<object[]>
{
    private readonly List<object[]> _data = new List<object[]>
    {
        new object[] { "hello world", 'w', 6 },
        new object[] { "goodnight moon", 'w', -1 }
    };

    public IEnumerator<object[]> GetEnumerator()
    { return _data.GetEnumerator(); }

    IEnumerator IEnumerable.GetEnumerator()
    { return GetEnumerator(); }
}

テストに 1 つまたは 2 つのパラメーターしかない場合は問題ありませんが、一部のパラメーターには Customer オブジェクトやその他のオブジェクトに入力する必要がある 20 以上のパラメーターがあるため、上記の例のように 20 以上のパラメーターをメソッドに渡すことは避けたいと考えています。 Customer オブジェクトを設定するために使用できる TestContext のようなオブジェクトまたは別のオブジェクトにデータを設定するか、特定のテスト行のデータが既に設定されている Customer オブジェクトを渡します。

上記のいずれかが可能ですか、または非常に多くのパラメーターを渡すことを避けながらこれを行う別の方法はありますか? そうでない場合、このテストを別の方法で行いますか?

ガイダンス/アドバイスをいただければ幸いです。

4

1 に答える 1

0

最近、これをもう一度見て、それを理解しました。初めてxUnitを使用しようとしたとき、リストタイプを使用してテストデータを提供する必要があることを知りませんでした。

public class TestDataFixture
{
    public static IEnumerable<object[]> TestData
    {
        get
        {
            var testCases = new List<object[]>();

            var testCase = new object[1];

            var testData1 = new TestDataClass()
            {
                name = "Piet",
                surname = "Pompoies"
            };

            testCase[0] = testData1;

            testCases.Add(testCase);

            return testCases;
        }
    }
}

public class DieMatrixReloaded
{
    [Theory]
    [MemberData("TestData", MemberType = typeof(TestDataFixture))]
    public void DieMatrixReloadedTheory(TestDataClass testData)
    {
        var someVar = testData;
        //Assert something here...
    }
}
于 2015-10-21T04:28:23.663 に答える