Search code examples
c#tddnunit

How to pass struct parameter to test function by using [TestCase] or [TestCaseSource] in NUNIT


I practice TDD nowadays. I wanna simplify my poor test function by using [TestCase] or [TestCaseSource] attribute. please help me. this is my funcion now

    [Test]
    public void GetLength_TEST_1()
    {
        double output = Program.GetLength(new Point { x = 1, y = 2 }, new Point { x = 7, y = 8 });

        output *= 1000;
        output = Math.Truncate(output);
        output /= 1000;

        Assert.AreEqual(8.485, output);            
    }

    [Test]
    public void GetLength_TEST_2()
    {
        double output = Program.GetLength(new Point { x = 2, y = 7 }, new Point { x = -8, y = -6 });

        output *= 1000;
        output = Math.Truncate(output);
        output /= 1000;

        Assert.AreEqual(16.401, output);
    }

Solution

  • Use TestCaseSource attribute.

    Note the same test method should exercise both test case.

    Something like below.

    [TestFixture]
    public class MyClass
    {
        public class PointTestCase
        {
            public string TestName { get; private set; }
            public Point P1 { get; set; }
            public Point P2 { get; set; }
            public double Result { get; set; } 
    
            public PointTestCase(Point p1, Point p2, double result)
            {
                P1 = p1;
                P2 = p2;
                Result = result;
            }
    
            public override string ToString()
            {
                return TestName;
            }
        }
    
        private static IEnumerable<PointTestCase> PointTestCases
        {
            get
            {
                yield return new PointTestCase(new Point { x = 1, y = 2 }, new Point { x = 7, y = 8 }, 8);
                yield return new PointTestCase(new Point { x = 2, y = 7 }, new Point { x = -8, y = -6 }, -12);
            }
        }
    
        [Test, TestCaseSource("PointTestCases")]
        public void GetLength_TEST(PointTestCase pointTestCase)
        {
            double output = Program.GetLength(pointTestCase.P1, pointTestCase.P2);
    
            output *= 1000;
            output = Math.Truncate(output);
            output /= 1000;
    
            Assert.AreEqual(pointTestCase.Result, output);
        }
    }
    
    public static class Program
    {
        public static double GetLength(Point p1, Point p2)
        {
            //some logic/calculation
            return p1.x * p2.y;
        }
    }
    
    public class Point
    {
        public double x { get; set; }
        public double y { get; set; }
    }