.NET Core 2.2:xUnit Theory Inlinedata无法使用枚举值

时间:2019-05-25 16:54:14

标签: unit-testing .net-core xunit

有人知道如何将xUnit与带有枚举值的“ Theory”和“ Inlinedata”一起使用吗?这导致测试无法识别为测试并且无法运行:

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

如果我使用枚举的int值而不是枚举值,则测试可以正常运行。

2 个答案:

答案 0 :(得分:3)

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

引用xUnit Theory: Working With InlineData, MemberData, ClassData

答案 1 :(得分:3)

您不需要[MemberData]enum值应立即可用。根据{{​​3}} enums 常量:

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

下面的代码示例对我有用(.net core 3.0 xUnit Test Project 模板):

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

其他事情一定会给您带来麻烦。