如何使用自定义SpecimenBuilder与AutoFixture创建新的对象实例。

问题描述 投票:0回答:1

目前我有这样的代码。

private ConnectedClient WithConnection(IConnection connection)
{
    var builder = new ClientWithConnectionSpecimenBuilder(connection);

    Fixture.Customizations.Add(builder);
    var client = Fixture.Create<ConnectedClient>();
    Fixture.Customizations.Remove(builder);

    return client;
}

基本上我需要创建新的实例 ConnectedClient 类在我的测试代码中指定连接。而且我已经建立了自定义的标本构建器来实现它。

但是没有类似于

Fixture.Create<T>(specimenBuilder) 

所以我需要自定义夹具。

"夹具 "那里是我的基础测试类的继承保护属性,已经设置了一些自定义的AutoMoqData自定义,所以我需要重新使用它来创建对象。

c# .net unit-testing xunit autofixture
1个回答
1
投票

应该可以使用一次性的 Build 方法来使用特定的样本构建器进行定制。

var client = fixture.Build<ConnectedClient>().FromFactory(builder).Create();

请注意,这样做将禁用夹具的任何其他定制。

DSL支持更多的自定义方法,可以使用 WithWithout所以如果你想在属性上做一些额外的定制,你可以这样做。

var client = fixture.Build<ConnectedClient>()
    .FromFactory(builder)
    .With(cc => cc.SomeProperty, () => fixture.Build<T>().FromFactory(otherFactory).Create())
    .Create();

但是对于重要的自定义来说,这将会变得非常繁琐。Autofixture的意见是这样的。

Build 方法是真正的一次性解决方案。如果您想更多地依靠Autofixture的机器来完成所有的工作,那么您可以使用以下方法 除了 来创建客户端连接,我建议依靠现有的 Freeze 方法和 Frozen 属性,以保持注入的 IConnection 一样 ConnectedClient这将消除对具体的 "三无 "产品的需求。ISpecimenBuilder.

© www.soinside.com 2019 - 2024. All rights reserved.