How do I put new List<int> {1} in an NUNIT TestCase?

跟風遠走 提交于 2019-11-28 21:08:35

There is one option to use TestCaseSource attribute. Here I provide a non-assert test with two cases just to see how it works:

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

Anyhow I have to mention it is not the most evident solution and I would prefer neatly organized fixtures ignoring the fact they are more verbose

My solution is simpler, I just use params. I hope this works for you!

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

I often use strings and parsing as it renders nicely in the testrunner. Sample:

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

Looks like this in Resharper's runner:

Improve code for @Yurii Hohan answer:

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))]

Hope this help.

You can use this :

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

public void Add_WithOneNumber_ReturnsNumber(int[] numbers)

use array as parameter new [] {1} and convert it to List inside the test method result.ToList(). This needs 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());
}

You can't use objects only compile-time constants in data attributes. To avoid using reflection, which I find to be extremely unreadable and not at all appropriate for a test which is meant to formally describe behavior as clearly as possible, here's what I do:

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

It's a few more lines, but that's only because I want clear test output. You could just as easily put them in one [Test] if you are looking for something more concise.

Just create the list inside the method instead, like this:

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

    Assert.AreEqual(1, result);
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!