【问题标题】:How to update an Enum value except of a specific value如何更新除特定值之外的枚举值
【发布时间】:2019-12-01 06:42:36
【问题描述】:

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

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

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

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

如何使用假实例值以外的值启动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();
        }
    }
 }

【问题讨论】:

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


    【解决方案1】:

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

    向接受枚举值的构建器添加方法并将其设置为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);
    }
    

    【讨论】:

      【解决方案2】:

      基于this 答案:

      int enumLength = System.Enum.GetNames(typeof(E_BooEnum)).Length;
      fooClass2.BooEnum = (BooEnum)GiveMeANumberExcept(enumLength, (int)fooClass1.BooEnum);
      

      生成一个没有异常索引的数组并返回其中一个值:

      private int GiveMeANumberExcept(int enumLength, int expectIndex)
      {
          var exclude = new HashSet<int>() { expectIndex };
          var range = Enumerable.Range(0, enumLength).Where(i => !exclude.Contains(i));
      
          var rand = new System.Random();
          int index = rand.Next(0, enumLength - exclude.Count);
          return range.ElementAt(index);
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-29
        相关资源
        最近更新 更多