c# - 如何更新除特定值之外的枚举值

标签 c# unit-testing .net-core enums

我的 UnitTest 的目标是验证 ValidateEquality 是否会为 FooClass 的两个不相等的实例返回 false。

我只询问单元测试的排列部分,而行为和断言并不重要。

我有一个构建器外观,它正在创建所需 FooClass (BuilderFacade.BuildFooClass()) 的假实例,以及创建它的真实实例的真实服务 api (GetFooClassFromSomewhere)。

问题是 BuilderFacade 创建了一个随机的 E_BooEnum 值,为了让这个单元测试每次都通过,我需要使用与 fooClass1BooEnum 随机值不同的 BooEnum 值实例化 foolClass2

如何使用除假实例值之外的值启动 BooEnum

[TestMethod]
public void AreEqual_DifferentBooEnum_ShouldReturnFalse()
{
    //Arrange:
    FooClass fooClass1 = BuilderFacade.BuildFooClass();
    FooClass fooClass2 = GetFooClassFromSomewhere();
    fooClass2.BooEnum = ! fooClass1.BooEnum // <--------Every possible value is OK besides the `fooClass1.BooEnum` value.

    ...
    //Act
    var result = service.ValidateEquality(fooClass1, fooClass2);
    //Assert
    Assert.IsFalse(result);
}

public class BuilderFacade
{
    public static FooClass BuildFooClass()
    {
        Random rand = new Random();
        E_BooEnum booEnum = (E_BooEnum)rand.Next(System.Enum.GetNames(typeof(E_BooEnum)).Length);
        return new FooClass()
        {
            BooEnum = booEnum
        };
    }
}

型号:

public class FooClass
{
    public E_BooEnum BooEnum { get; set; }
    public override in GetHashCode()
    {
        unchecked
        {
            int hash = 17;
            hash = hash * 31 + this.BooEnum.GetHashCode();
        }
    }
 }

最佳答案

使用固定值而不是随机值。
在测试中,您希望控制传递给测试下的类的值。

向构建器添加接受枚举值的方法并将其设置为 FooClass

public class FooBuilder
{
    private readonly BooEnum _boo;

    public FooBuilder(BooEnum boo)
    {
        _boo = boo;
    }

    public FooClass Create()
    {
        return new FooClass()
        {
            BooEnum = _boo
        };
    }
}

不确定 MSTest,但例如在 xUnit 中,您可以使用内联参数进行测试,您可以为所有枚举值提供预期的验证结果

[Theory]
[InlineData(BooEnum.First, BooEnum.Second, false)]
[InlineData(BooEnum.Second, BooEnum.First, false)]
[InlineData(BooEnum.First, BooEnum.First, true)]
[InlineData(BooEnum.Second, BooEnum.Second, true)]
public void AreEqual_DifferentBooEnum_ShouldReturnFalse(BooEnum first, BooEnum second, bool expected)
{
    var firstFoo = new FooBuilder(first).Create();
    var secondFoo = new FooBuilder(second).Create();

    var actual = service.ValidateEquality(firstFoo, secondFoo);

    actual.Should().Be(expected);
}

关于c# - 如何更新除特定值之外的枚举值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59123196/

相关文章:

c# - 为什么我不能将此对象隐式转换为类引用

c++ - 类里面大量数学运算的测试

java - @BeforeClass 和继承 - 执行顺序

c# - C# 命令行中的自定义主入口点参数

c# - Web api dotnet 核心中 Api 版本控制错误的自定义错误响应

c# - .NET Core 2.0 Crypto 示例不工作 - 错误 Cng v4.3 使用高于引用算法 v4.2 的算法 v4.3

c# - NoWarn 在 DNX 中不工作

c# - 将 Any-Element 添加到动态创建的 XSD-Schema 时出现问题

c# - 获取蓝牙 COM 端口

c# - MVC4/Mocking Controller.Request