通过 FakeItEasy 和 AutoFixture 注入假混凝土 class

Injecting a fake concrete class via FakeItEasy and AutoFixture

我有一个 class 我想测试具体 class (MyClient) 被注入的位置。

private readonly MyClient _client;

public Sync(MyClient client)
{
    _client = client;
}

我们使用 xUnit、AutoFixture 和 FakeItEasy 进行测试。当向 class.

注入接口时,这一切都工作得很好

但是,当使用以下测试设置时

[Theory]
[AutoFakeData]
public async Task It_should_invoke_client(
    [Frozen]MyClient geoClient,
    [Frozen]ILogger logger,
    Sync sync)
{
    // Act
    await sync.Run(null, logger);

    //Assert
    A.CallTo(() => myClient.SyncAllAsync(A<CancellationToken>.Ignored)).MustHaveHappenedOnceExactly();
}

伪造的 GeoClient 没有注入到 sync 参数中。创建的 sync 表明注入的 MyClient 不是伪造的对象。

System.ArgumentException : Object 'Some.Namespace.MyClient' of type Some.Namespace.MyClient is not recognized as a fake object.

通过 sync 进行调试时,我发现这是正确的。 'normal' MyClient 已被注入到被测系统中。

据我从文档中了解到,应该可以正常工作。我可能遗漏了一些明显的步骤,但找不到它。

AutoFakeItEasy 仅在请求的样本属于抽象类型或接口类型时才提供伪造。见 FakeItEasyRelay:

return type.GetTypeInfo().IsAbstract || type.GetTypeInfo().IsInterface;

您似乎可以通过提供自定义 ISpecimenBuilder 中继来覆盖它,但我还没有尝试过。