我的 UnitTest 的目标是验证 ValidateEquality
是否会为 FooClass
的两个不相等的实例返回 false。
我只询问单元测试的排列部分,而行为和断言并不重要。
我有一个构建器外观,它正在创建所需 FooClass
(BuilderFacade.BuildFooClass()
) 的假实例,以及创建它的真实实例的真实服务 api (GetFooClassFromSomewhere
)。
问题是 BuilderFacade
创建了一个随机的 E_BooEnum
值,为了让这个单元测试每次都通过,我需要使用与 fooClass1
的 BooEnum
随机值不同的 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/