46

私は方法を持っています:

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

new List<int> {1}これに対する私のテストは次のとおりですが、TestCase では気に入りません。

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

8 に答える 8

61

TestCaseSource属性を使用するオプションが 1 つあります。ここでは、それがどのように機能するかを確認するためだけに、2 つのケースで非アサート テストを提供します。

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

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

とにかく、それは最も明白な解決策ではないことに言及しなければなりません。より冗長であるという事実を無視して、きちんと整理されたフィクスチャを好むでしょう

詳細: https://github.com/nunit/docs/wiki/TestCaseSource-Attribute

于 2013-10-20T16:59:05.117 に答える
27

私の解決策はより簡単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);
}
于 2015-12-08T21:14:50.533 に答える
8

テストランナーでうまくレンダリングされるため、文字列と解析をよく使用します。サンプル:

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

Resharper のランナーでは次のようになります。

ここに画像の説明を入力

于 2016-05-21T15:13:48.500 に答える
4

これを使用できます:

[TestCase(new []{1,2,3})]
public void Add_WithOneNumber_ReturnsNumber(int[] numbers)
于 2018-10-18T10:31:51.117 に答える