.NET Core 2.2:xUnit Theory Inlinedata 不适用于枚举值

Ing*_*goB 10 c# unit-testing xunit .net-core

有人知道如何将 xUnit 与“Theory”和“InlineData”一起使用enum值?这导致测试不被识别为测试并且不运行:

[Theory]
[InlineData("12h", 12, PeriodUnit.Hour)]
[InlineData("3d", 3, PeriodUnit.Day)]
[InlineData("1m", 1, PeriodUnit.Month)]
public void ShouldParsePeriod(string periodString, int value, PeriodUnit periodUnit)
{
    var period = Period.Parse(periodString);
    period.Value.Should().Be(value);
    period.PeriodUnit.Should().Be(periodUnit);
}
Run Code Online (Sandbox Code Playgroud)

如果我使用枚举的 int 值而不是枚举值,则测试工作并运行。

Aag*_*age 6

你不需要[MemberData]enum值应该是开箱即用的。根据文档 enums 常量:

An enum type is a distinct value type (Value types) that declares a set of named constants.

下面的代码示例适用于我(.net core 3.0 xUnit 测试项目模板):

public class UnitTest1
{
    public enum Foo { Bar, Baz, Qux }

    [Theory]
    [InlineData(Foo.Bar, Foo.Baz)]
    public void Test1(Foo left, Foo right)
    {
        Assert.NotEqual(left, right);
    }
}
Run Code Online (Sandbox Code Playgroud)

一定有别的东西给你带来了麻烦。

  • 既然您接受了这个答案,您能否详细说明一下真正的问题是什么?这真的让我很感兴趣:) (2认同)

Nko*_*osi 5

需要常量表达式的属性[InlineData],例如 int、bool、string 等。

[MemberData]如果内联未将枚举识别为常量,请改为使用。

[Theory]
[MemberData(nameof(PeriodData))]
public void ShouldParsePeriod(string periodString, int value, PeriodUnit periodUnit) {
    var period = Period.Parse(periodString);
    period.Value.Should().Be(value);
    period.PeriodUnit.Should().Be(periodUnit);
}


public static IEnumerable<object[]> PeriodData() {
    yield return new object[] { "12h", 12, PeriodUnit.Hour };
    yield return new object[] { "3d", 3, PeriodUnit.Day };
    yield return new object[] { "1m", 1, PeriodUnit.Month };
}
Run Code Online (Sandbox Code Playgroud)

参考xUnit 理论:使用 InlineData、MemberData、ClassData