测试用例在dotnet核心项目中显示不正确

时间:2018-09-22 08:23:11

标签: c# unit-testing nunit resharper

我正在尝试为我的dotnet核心项目中的测试创建测试用例。但是resharper显示它们没有在resharper的“单元测试会话”窗口中分组。

我的代码:

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核心项目共享工具中显示

enter image description here

在dotnet框架中显示

enter image description here

在框架中测试分组。我在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

更新

遇难者无法识别我的测试的情况

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

2 个答案:

答案 0 :(得分:0)

我不知道为什么,但是在使用Resharper时,使用.SetName()的{​​{1}}方法似乎会使测试有些混乱。测试有时显示为不确定

为了正确地对单元测试进行分组(即,不仅显示测试类,还显示测试方法),我决定进行如下重构:

1)删除方法TestCaseData

.SetName()

2)重构测试方法

我使用Arrange-Act-Assert模式重构了测试方法。现在可以使用Fluent断言设置测试消息:

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

Test Explorer-单元测试结果:

Test Explorer unit tests results

Resharper-单元测试会议:

Resharper - Unit Test Sessions

答案 1 :(得分:0)

  

您是否对dotnet Core和dotnet框架中显示的区别有建议?我需要命名测试用例。默认命名基于ToString,我必须在测试用例类中使用的所有命名都覆盖它

代替使用.SetName()的方法TestCaseData,您可以创建一个测试用例对象并覆盖.ToString()方法,如下所示:

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

测试资源管理器-单元测试结果:

Test Explorer - unit tests results

Resharper-单元测试结果:

Resharper - Unit Test Sessions