测试用例在 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 核心应用程序需要它。

谁能帮帮我?

我正在使用:

更新

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 - 单元测试结果: