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

How to create new instances of objects with custom SpecimenBuilder with AutoFixture

目前我有这样的代码:

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 class 的新实例。我已经构建了自定义标本生成器来做到这一点。

但是没有像

这样的方法
Fixture.Create<T>(specimenBuilder) 

所以我需要定制灯具。

"Fixture" 我的基础测试 class 的继承保护 属性 已经设置了一些自定义 AutoMoqData 定制,因此我需要重用它来创建对象。

应该可以使用一次性 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属性使给定 ConnectedClient 的注入 IConnection 保持相同,这将避免对特定 ISpecimenBuilder.

的需要