2014-11-20 67 views
0

我正在编写单元测试,其中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方法来创建一个Locate对象与一组忽略通过Without方法调用规则。这是我为每个测试需要的基线对象。每个测试都可以通过With方法调用忽略其他字段或硬代码字段值。

我期望通过,因为我设置了Build lambda参数,将TicketNo属性设置为123.相反,测试失败,因为AutoFixture使用随机整数种子TicketNo

我该如何做到这一点?

回答

0

解决方案!

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(); 
    } 
相关问题