1

我使用 mstest 编写了以下测试,我有一个 Excel 表,上面有大约 20 行,每行测试运行一次,TestContext 的 DataRow 属性填充了该行的数据。TestContext 对象被传递给 PopulateCustomerViaDataSource 方法,以便使用 Excel 工作表中的客户详细信息填充客户对象,然后将客户对象传递给 Web 方法,以便将详细信息导入另一个应用程序。因此,基本上,特定测试运行的所有数据都可以使用一个对象访问,即 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 个参数,那很好,但其中一些有 20 多个参数,需要填充 Customer 对象和其他对象,所以我想避免像上面的示例那样将 20 多个参数传递到方法中要么有一些类似 TestContext 的对象,要么是另一个填充了数据的对象,我可以用它来填充 Customer 对象,或者传入一个已经填充了特定测试行的数据的 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 回答