如何将新的List <int> {1}放入NUNIT TestCase?</int>

时间:2013-10-20 16:26:34

标签: c# tdd nunit testcase

我有方法:

public static int Add(List<int> numbers)
    {
        if (numbers == null || numbers.Count == 0)
            return 0;

        if (numbers.Count == 1)
            return numbers[0];


        throw new NotImplementedException();
    }

这是我对它的测试,但它不喜欢TestCase中的new List<int> {1}

    [TestCase(new List<int>{1}, 1)]
    public void Add_WithOneNumber_ReturnsNumber(List<int> numbers)
    {

        var result = CalculatorLibrary.CalculatorFunctions.Add(numbers);

        Assert.AreEqual(1, result);
    }

它给了我错误:

An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type

我必须这样做:

    [Test]
    public void Add_WithOneNumber_ReturnsNumber()
    {

        var result = CalculatorLibrary.CalculatorFunctions.Add(new List<int>{7});


        Assert.AreEqual(7, result);

        var result2 = CalculatorLibrary.CalculatorFunctions.Add(new List<int> {3});

        Assert.AreEqual(4,result2);
    }

8 个答案:

答案 0 :(得分:42)

有一个选项可以使用 TestCaseSource 属性。在这里,我提供了两个案例的非断言测试,只是为了看它是如何工作的:

[TestFixture]
public class TestClass
{
    private object[] _sourceLists = {new object[] {new List<int> {1}},  //case 1
                                     new object[] {new List<int> {1, 2}} //case 2
                                    };

    [Test, TestCaseSource("_sourceLists")]
    public void Test(List<int> list)
    {
        foreach (var item in list)
            Console.WriteLine(item);
    }
}

无论如何我不得不提到它不是最明显的解决方案而且我更喜欢整齐有序的灯具而忽略了它们更加冗长的事实

答案 1 :(得分:18)

我的解决方案更简单,我只使用params。我希望这适合你!

[TestCase(1, 1)]
[TestCase(10, 5, 1, 4)]
[TestCase(25, 3, 5, 5, 12)]
public void Linq_Add_ShouldSumAllTheNumbers(int expected, params int[] numbers)
{
    var result = CalculatorLibrary.CalculatorFunctions.Add(numbers);
    Assert.AreEqual(expected, result);
}

答案 2 :(得分:4)

我经常使用字符串和解析,因为它在testrunner中呈现得很好。样品:

[TestCase("1, 2")]
[TestCase("1, 2, 3")]
public void WithStrings(string listString)
{
    var list = listString.Split(',')
                         .Select(int.Parse)
                         .ToList();
    ...
}

在Resharper的跑步者中看起来像这样:

enter image description here

答案 3 :(得分:2)

改进@Yurii Hohan答案的代码:

private  static readonly object[] _Data =
        {
            new object[] {new List<int> {0}, "test"},
            new object[] {new List<int> {0, 5}, "test this"},
        };

[Test, TestCaseSource(nameof(_Data))]

希望获得帮助。

答案 4 :(得分:1)

您可以使用此:

[TestCase(new [] {1,2,3})]

公共无效Add_WithOneNumber_ReturnsNumber(int []个数字)

答案 5 :(得分:0)

使用数组作为参数new [] {1},并将其转换为测试方法result.ToList()中的List。这需要using System.Linq;

[TestCase(new [] {1}, 1)]
[TestCase(new [] {2}, 2)]
[TestCase(new [] {1000}, 1000)]
public void Add_WithOneNumber_ReturnsNumber(int[] numbers)
{

    var result = CalculatorLibrary.CalculatorFunctions.Add(numbers);

    Assert.AreEqual(1, result.ToList());
}

答案 6 :(得分:-1)

您不能仅在数据属性中使用对象编译时常量。为了避免使用反射,我觉得这种反射极其难以理解,并且根本不适合用于正式描述行为的测试,这就是我所做的:

    [Test]
    public void Test_Case_One()
    {
        AssertCurrency(INPUT, EXPECTED);
    }

    [Test]
    public void Test_Case_Two()
    {
        AssertCurrency(INPUT, EXPECTED);
    }

    private void AssertScenario(int input, int expected)
    {
        Assert.AreEqual(expected, input);
    }

这是几行,但这只是因为我想要清晰的测试输出。如果您正在寻找更简洁的东西,您可以轻松地将它们放在一个[测试]中。

答案 7 :(得分:-3)

只需在方法中创建列表,如下所示:

public void Add_WithOneNumber_ReturnsNumber()
{
    var result = CalculatorLibrary.CalculatorFunctions.Add(new List<int>{1});

    Assert.AreEqual(1, result);
}