如何通过参数执行其他对象配置



我正在编写单元测试,其中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();
    }

最新更新