C#, NUnit Assert in a Loop

后端 未结 3 1111
佛祖请我去吃肉
佛祖请我去吃肉 2021-02-13 09:18

I have a school assignment where I need to create a data-driven style of NUnit testing. Using the below code, I am able to get the data from the database, but everytime an \'Ass

相关标签:
3条回答
  • 2021-02-13 09:55

    The [TestCaseSource] attribute will allow you to do this. You can create a function that returns an enumerable list of test cases

    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;
        }
    }
    

    then you can pass a TestCaseSource in:

        [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);
            }
        }
    
    0 讨论(0)
  • 2021-02-13 09:58

    you can do this using the data driven tests in nunit, but i'm not sure you can do it for data that comes from the database. something along the lines of:

    [TestFixture]
    public class RowTestSample
    {
         [RowTest]
         [Row( 1)]
         [Row( 2)]
         [Row( 3)]
         [Row( 4)]
         [Row( 5)]
         [Row( 6)]
         public void GetProductById(int productId)
         {
              Assert.That(pm.GetProductById(productId),Is.Not.Null);
         }
    }
    

    where the values in Row(n) are the product ids you want to test. This will show as 6 tests, each one with a different value.

    I'm not sure if these can come from the DB, but probably this is not a good thing to be doing in the test anyway.

    I'm not sure of the value in these tests either, I suppose it depends on what ProductManager is doing.

    0 讨论(0)
  • 2021-02-13 10:19

    Beside using the RowTest extension as suggested by Sam Holder you can also use the TestCaseAttribute for this:

    [TestFixture]
    public class TestCaseSample 
    {      
        [TestCase(1)]
        [TestCase(2)]
        [TestCase(3)]
        [TestCase(4)]
        [TestCase(5)]
        [TestCase(6)]
        public void GetProductById(int productId)
        {           
            Assert.That(pm.GetProductById(productId),Is.Not.Null);
        } 
    } 
    
    0 讨论(0)
提交回复
热议问题