我正在编写单元测试,其中SUT(被测系统)可以进行各种不同的配置。我没有为每个组合添加一个参数,而是决定(或尝试)采用另一种更干净的方法。对于那些不知道的人,Fixture
对象来自一个名为AutoFixture的库,该库处理种子随机测试值。
这是我失败的测试——
[Test]
public void Test()
{
var locate = Build(x => x.With(xx => xx.TicketNo, 123));
Assert.AreEqual(123, locate.TicketNo);
}
private Locate Build(Action<ICustomizationComposer<Locate>> customizationAction)
{
var fixture = new Fixture();
var customizationComposer = fixture.Build<Locate>();
customizationAction(customizationComposer);
var postProcessComposer = customizationComposer
.Without(x => x.Attachments)
.Without(x => x.Comments)
.Without(x => x.Reviews)
.Without(x => x.ScheduledCrew)
.Without(x => x.PendingDecision)
.Without(x => x.FinalDecision)
.Without(x => x.ConflictResolution);
return postProcessComposer.Create();
}
正如您所知,我正在尝试使用 Build
方法通过 Without
方法调用创建具有一组忽略规则的 Locate
对象。这是我每次测试所需的基线对象。每个测试都可以选择通过 With
方法调用忽略其他字段或硬代码字段值。
我希望通过,因为我将 Build
lambda 参数设置为将 TicketNo
属性设置为 123。相反,测试失败,因为自动固定装置使用随机整数TicketNo
种子。
我怎样才能做到这一点?
解决方案!
private Locate Build(Func<IPostprocessComposer<Locate>, IPostprocessComposer<Locate>> action)
{
var customizationComposer = _fixture.Build<Locate>();
var postProcessComposer = customizationComposer
.With(x => x.TicketNo, DateTime.Now.ToFileTime())
.With(x => x.On1CallNotified, false)
.Without(x => x.Attachments)
.Without(x => x.Comments)
.Without(x => x.Reviews)
.Without(x => x.ScheduledCrew)
.Without(x => x.PendingDecision)
.Without(x => x.FinalDecision)
.Without(x => x.ConflictResolution);
postProcessComposer = action(postProcessComposer);
return postProcessComposer.Create();
}