我有一个处理打印的小型 C# 类。 我想为这个类创建(n)单元测试,使用 fakeItEasy。我怎样才能伪造这个内部调用 不伪造整个 SUT 的情况下上课?
例如:
public class MyPrintHandler: IMyPrintHandler
{
public MyPrintHandler(ILogger<MyPrintHandler> logger)
{
}
// function I want to (unit test
public async Task<bool> PrintAsync(string ipaddress)
{
try
{
if (!string.IsNullOrWhiteSpace(ipaddress) )
{
return await StartPrint(ipaddress); // This cannot be called in a unit test, because it really start printing on a printer.
}
}
catch (Exception e)
{
}
return false;
}
private async Task<bool> StartPrint(string ipaddress)
{
// prints on the printer
}
[TestFixture]
public class MyPrintHandlerTests
{
[Test]
public void Succes_PrintAsync()
{
using (var fake = new AutoFake())
{
// Arrange - configure the fake
var sut = fake.Resolve<MyPrintHandler>();
// Act
await sut.PrintAsync("0.0.0.0"); // I want to prevent StartPrint() from being called..
}
}
}
我怎样才能实现这个目标,或者这根本不可能? 预先感谢!
最佳答案
我通常会说,伪造 SUT 是一种反模式,应尽可能避免,因为它会导致困惑。如果您可以重构以引入处理 StartPrinting 方法的协作者,我会强烈考虑这样做。如果这不可能,您可以尝试一下
- 您想要伪造的任何方法都必须是
virtual
或abstract
,否则FakeItEasy无法拦截它 - 您想要伪造的任何方法都必须是
public
(或internal
,如果可以 grant dynamic proxy access 到生产代码的内部) - 然后您将伪造 SUT,指定它应该 call the original (base) methods ,最后
- 显式覆盖您要拦截的方法的行为
关于unit-testing - 使用 FakeItEasy 模拟 SUT 的内部调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62517958/