通过 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
中继来覆盖它,但我还没有尝试过。
我有一个 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
中继来覆盖它,但我还没有尝试过。