C#,NUnit在循环中断言

And*_*rew 14 .net c# nunit unit-testing

我有一个学校作业,我需要创建一个数据驱动的NUnit测试风格.使用下面的代码,我可以从数据库中获取数据,但每次'Assert'调用失败时,测试都会停止.

有没有什么方法可以实际显示循环的结果作为六个不同的测试(考虑到我的数据库中有六行)?

namespace TestClasses
{
    [TestFixture]
    public class TestingClass : ConnectionClass
    {
        private ProductManagement pm;

        [TestFixtureSetUp]
        public void CreateTestClass()
        {
            pm = new ProductManagement();
        }

        [TestCase]
        public void GetProductDetailsTest()
        {
            SqlDataAdapter da = new SqlDataAdapter("Select * From GetProductDetailsTest;", Connection);
            Database1DataSet.GetProductDetailsTestDataTable dt = new Database1DataSet.GetProductDetailsTestDataTable();
            da.Fill(dt);

            foreach (Database1DataSet.GetProductDetailsTestRow dr in dt.Rows)
            {
                if (pm.GetProductById(dr.productId) == null)
                    Assert.Fail("Id of test case: " + dr.id + ", Product id of failure: " + dr.productId);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

基本上我正在寻找的是,如果可能的话,NUnit将显示3个通过的测试和3个失败的测试!任何帮助将不胜感激,谢谢!:)

Mar*_*ath 16

[TestCaseSource]属性将允许您执行此操作.您可以创建一个返回可枚举测试用例列表的函数

public IEnumerable<Database1DataSet.GetProductDetailsTestRow> GetTestCases()
{
    SqlDataAdapter da = new SqlDataAdapter("Select * From GetProductDetailsTest;", Connection);
    Database1DataSet.GetProductDetailsTestDataTable dt = new Database1DataSet.GetProductDetailsTestDataTable();
    da.Fill(dt);

    foreach (Database1DataSet.GetProductDetailsTestRow dr in dt.Rows)
    {
        yield return dr;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以传递一个TestCaseSource:

    [Test, TestCaseSource("GetTestCases")]
    public void GetProductDetailsTest(Database1DataSet.GetProductDetailsTestRow dr)
    {
        if (pm.GetProductById(dr.productId) == null)
            Assert.Fail("Id of test case: " + dr.id + ", Product id of failure: " + dr.productId);
        }
    }
Run Code Online (Sandbox Code Playgroud)