测试用例在 dotnet 核心项目中显示不正确
Test cases shown incorrectly in dotnet core project
我正在尝试为我的 dotnet 核心项目中的测试创建测试用例。但是 resharper 显示它们没有在 resharper 的 "unit test sessions" window
中分组
我的代码:
public class Calculator
{
public static int Multiply(int x, int y)
{
return x * y;
}
}
[TestFixture]
public class CalculatorTests
{
private static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(3, 4, 12).SetName("Multiply 3 and 4 should be 12");
yield return new TestCaseData(4, 5, 20).SetName("Multiply 4 and 5 should be 20");
}
}
private static IEnumerable<TestCaseData> CalculatorTestCaseDataWithZero
{
get
{
yield return new TestCaseData(0, 4, 12).SetName("Multiply 0 and 4 should be 0");
yield return new TestCaseData(5, 0, 20).SetName("Multiply 5 and 0 should be 0");
}
}
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseDataWithZero))]
public void Calculate_Success(int x, int y, int expected)
{
Calculator.Multiply(x, y).Should().Be(expected);
}
}
在 dotnet 核心项目 resharper 中显示
在 dotnet 框架中显示
在框架测试中分组。我的 dotnet 核心应用程序需要它。
谁能帮帮我?
我正在使用:
- dotnet 核心 - 2.1
- Nunit - 3.10.1
- NUnitTestAdapter - 3.10.0
- Microsoft.NET.Test.Sdk - 15.8.0
- Resharper - 2018.2.3
- VS 社区 2017 - 15.8.2
- FluentAssertions - 5.4.2
更新
resharper 无法识别我的测试的情况
public class Calculator
{
public static int Multiply(MyInt x, MyInt y)
{
return x.Value * y.Value;
}
}
[TestFixture]
public class CalculatorTests
{
private static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(new MyInt(3), new MyInt(4), new MyInt(12)).SetName("2132");
yield return new TestCaseData(new MyInt(4), new MyInt(5), new MyInt(20)).SetName("123123asdas");
}
}
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
public void Calculate_Success(MyInt x, MyInt y, MyInt expected)
{
Calculator.Multiply(x, y).Should().Be(expected.Value);
}
}
public class MyInt
{
public int Value;
public MyInt(int value)
{
Value = value;
}
}
我不知道为什么,但是在使用 Resharper 时,使用 TestCaseData
的方法 .SetName()
似乎有点搞乱了测试。测试有时显示为不确定。
为了正确地对单元测试进行分组(即不仅显示测试 class 还显示测试方法)我决定进行一些重构,如下所示:
1) 删除方法.SetName()
public static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(3, 4, 12);
yield return new TestCaseData(4, 5, 20);
}
}
public static IEnumerable<TestCaseData> CalculatorTestCaseDataWithZero
{
get
{
yield return new TestCaseData(0, 4, 12);
yield return new TestCaseData(5, 0, 20);
}
}
2) 重构测试方法
我重构了测试方法,使用 Arrange-Act-Assert 模式。现在使用 Fluent Assertions 设置测试消息:
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseDataWithZero))]
public void Calculate_Success(int x, int y, int expected)
{
// arrange/act
int result = Calculator.Multiply(x, y);
// assert
result.Should().Be(expected, because: $"Multiply {x} and {y} should be {expected}");
}
测试资源管理器 - 单元测试结果:
Resharper - 单元测试会话:
Do you have suggestions about difference between display in dotnet Core and dotnet framework? And i need to name my test cases. Default naming is based on ToString, i must override it for all used in test cases classes
您可以创建一个测试用例对象并覆盖 .ToString()
方法,而不是使用 TestCaseData
的方法 .SetName()
,如下所示:
public class CalculatorTestData
{
public CalculatorTestData(int x, int y, int expected)
{
X = x;
Y = y;
Expected = expected;
}
public int X { get; }
public int Y { get; }
public int Expected { get; }
/// <inheritdoc />
public override string ToString()
{
return $"Multiply {X} and {Y} should be {Expected}";
}
}
使用 CalculatorTestData
对象:
public static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(new CalculatorTestData(3, 4, 12));
yield return new TestCaseData(new CalculatorTestData(4, 5, 20));
}
}
public static IEnumerable<TestCaseData> CalculatorTestCaseDataWithZero
{
get
{
yield return new TestCaseData(new CalculatorTestData(0, 4, 12));
yield return new TestCaseData(new CalculatorTestData(5, 0, 20));
}
}
最后,重构测试方法以使用 CalculatorTestData
对象:
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseDataWithZero))]
public void Calculate_Success(CalculatorTestData data)
{
// arrange/act
int result = Calculator.Multiply(data.X, data.Y);
// assert
result.Should().Be(data.Expected, because: $"{data.X} * {data.Y} should be {data.Expected}");
}
测试资源管理器 - 单元测试结果:
Resharper - 单元测试结果:
我正在尝试为我的 dotnet 核心项目中的测试创建测试用例。但是 resharper 显示它们没有在 resharper 的 "unit test sessions" window
中分组我的代码:
public class Calculator
{
public static int Multiply(int x, int y)
{
return x * y;
}
}
[TestFixture]
public class CalculatorTests
{
private static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(3, 4, 12).SetName("Multiply 3 and 4 should be 12");
yield return new TestCaseData(4, 5, 20).SetName("Multiply 4 and 5 should be 20");
}
}
private static IEnumerable<TestCaseData> CalculatorTestCaseDataWithZero
{
get
{
yield return new TestCaseData(0, 4, 12).SetName("Multiply 0 and 4 should be 0");
yield return new TestCaseData(5, 0, 20).SetName("Multiply 5 and 0 should be 0");
}
}
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseDataWithZero))]
public void Calculate_Success(int x, int y, int expected)
{
Calculator.Multiply(x, y).Should().Be(expected);
}
}
在 dotnet 核心项目 resharper 中显示
在 dotnet 框架中显示
在框架测试中分组。我的 dotnet 核心应用程序需要它。
谁能帮帮我?
我正在使用:
- dotnet 核心 - 2.1
- Nunit - 3.10.1
- NUnitTestAdapter - 3.10.0
- Microsoft.NET.Test.Sdk - 15.8.0
- Resharper - 2018.2.3
- VS 社区 2017 - 15.8.2
- FluentAssertions - 5.4.2
更新
resharper 无法识别我的测试的情况
public class Calculator
{
public static int Multiply(MyInt x, MyInt y)
{
return x.Value * y.Value;
}
}
[TestFixture]
public class CalculatorTests
{
private static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(new MyInt(3), new MyInt(4), new MyInt(12)).SetName("2132");
yield return new TestCaseData(new MyInt(4), new MyInt(5), new MyInt(20)).SetName("123123asdas");
}
}
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
public void Calculate_Success(MyInt x, MyInt y, MyInt expected)
{
Calculator.Multiply(x, y).Should().Be(expected.Value);
}
}
public class MyInt
{
public int Value;
public MyInt(int value)
{
Value = value;
}
}
我不知道为什么,但是在使用 Resharper 时,使用 TestCaseData
的方法 .SetName()
似乎有点搞乱了测试。测试有时显示为不确定。
为了正确地对单元测试进行分组(即不仅显示测试 class 还显示测试方法)我决定进行一些重构,如下所示:
1) 删除方法.SetName()
public static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(3, 4, 12);
yield return new TestCaseData(4, 5, 20);
}
}
public static IEnumerable<TestCaseData> CalculatorTestCaseDataWithZero
{
get
{
yield return new TestCaseData(0, 4, 12);
yield return new TestCaseData(5, 0, 20);
}
}
2) 重构测试方法
我重构了测试方法,使用 Arrange-Act-Assert 模式。现在使用 Fluent Assertions 设置测试消息:
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseDataWithZero))]
public void Calculate_Success(int x, int y, int expected)
{
// arrange/act
int result = Calculator.Multiply(x, y);
// assert
result.Should().Be(expected, because: $"Multiply {x} and {y} should be {expected}");
}
测试资源管理器 - 单元测试结果:
Resharper - 单元测试会话:
Do you have suggestions about difference between display in dotnet Core and dotnet framework? And i need to name my test cases. Default naming is based on ToString, i must override it for all used in test cases classes
您可以创建一个测试用例对象并覆盖 .ToString()
方法,而不是使用 TestCaseData
的方法 .SetName()
,如下所示:
public class CalculatorTestData
{
public CalculatorTestData(int x, int y, int expected)
{
X = x;
Y = y;
Expected = expected;
}
public int X { get; }
public int Y { get; }
public int Expected { get; }
/// <inheritdoc />
public override string ToString()
{
return $"Multiply {X} and {Y} should be {Expected}";
}
}
使用 CalculatorTestData
对象:
public static IEnumerable<TestCaseData> CalculatorTestCaseData
{
get
{
yield return new TestCaseData(new CalculatorTestData(3, 4, 12));
yield return new TestCaseData(new CalculatorTestData(4, 5, 20));
}
}
public static IEnumerable<TestCaseData> CalculatorTestCaseDataWithZero
{
get
{
yield return new TestCaseData(new CalculatorTestData(0, 4, 12));
yield return new TestCaseData(new CalculatorTestData(5, 0, 20));
}
}
最后,重构测试方法以使用 CalculatorTestData
对象:
[Test]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseData))]
[TestCaseSource(typeof(CalculatorTests), nameof(CalculatorTestCaseDataWithZero))]
public void Calculate_Success(CalculatorTestData data)
{
// arrange/act
int result = Calculator.Multiply(data.X, data.Y);
// assert
result.Should().Be(data.Expected, because: $"{data.X} * {data.Y} should be {data.Expected}");
}