如何将新的List {1}放入NUNIT TestCase中?

我有方法:

public static int Add(List numbers) { if (numbers == null || numbers.Count == 0) return 0; if (numbers.Count == 1) return numbers[0]; throw new NotImplementedException(); } 

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

  [TestCase(new List{1}, 1)] public void Add_WithOneNumber_ReturnsNumber(List 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{7}); Assert.AreEqual(7, result); var result2 = CalculatorLibrary.CalculatorFunctions.Add(new List {3}); Assert.AreEqual(4,result2); } 

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

 [TestFixture] public class TestClass { private object[] _sourceLists = {new object[] {new List {1}}, //case 1 new object[] {new List {1, 2}} //case 2 }; [Test, TestCaseSource("_sourceLists")] public void Test(List list) { foreach (var item in list) Console.WriteLine(item); } } 

无论如何,我不得不提到它不是最明显的解决方案,我宁愿整齐有组织的灯具忽略了它们更详细的事实

我的解决方案更简单,我只使用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); } 

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

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

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

在此处输入图像描述

改进@Yurii Hohan的代码答案:

 private static readonly object[] _Data = { new object[] {new List {0}, "test"}, new object[] {new List {0, 5}, "test this"}, }; [Test, TestCaseSource(nameof(_Data))] 

希望这有帮助。

你可以用这个:

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

public void Add_WithOneNumber_ReturnsNumber(int [] numbers)

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

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

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

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

 public void Add_WithOneNumber_ReturnsNumber() { var result = CalculatorLibrary.CalculatorFunctions.Add(new List{1}); Assert.AreEqual(1, result); }