如何在NUNIT中使用[TestCase]或[TestCaseSource]将struct参数传递给测试函数

时间:2016-09-20 01:23:32

标签: c# tdd nunit

我现在练习TDD。 我想通过使用[TestCase]或[TestCaseSource]属性来简化我糟糕的测试功能。请帮我。这是我现在的功能

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

1 个答案:

答案 0 :(得分:1)

使用TestCaseSource属性。

请注意,相同的测试方法应该同时运行两个测试用例。

如下所示。

[TestFixture]
public class MyClass
{
    public class PointTextCase
    {
        public string TestName { get; private set; }
        public Point P1 { get; set; }
        public Point P2 { get; set; }
        public double Result { get; set; } 

        public PointTextCase(Point p1, Point p2, double result)
        {
            P1 = p1;
            P2 = p2;
            Result = result;
        }

        public override string ToString()
        {
            return TestName;
        }
    }

    private static IEnumerable<PointTextCase> PointTestCases
    {
        get
        {
            yield return new PointTextCase(new Point { x = 1, y = 2 }, new Point { x = 7, y = 8 }, 8);
            yield return new PointTextCase(new Point { x = 2, y = 7 }, new Point { x = -8, y = -6 }, -12);
        }
    }

    [Test, TestCaseSource("PointTestCases")]
    public void GetLength_TEST(PointTextCase 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; }
}