如何将新的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); }