unit-testing - 使用 FakeItEasy 模拟 SUT 的内部调用

标签 unit-testing nunit fakeiteasy

我有一个处理打印的小型 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 方法的协作者,我会强烈考虑这样做。如果这不可能,您可以尝试一下

  1. 您想要伪造的任何方法都必须是virtualabstract,否则FakeItEasy无法拦截它
  2. 您想要伪造的任何方法都必须是public(或internal,如果可以 grant dynamic proxy access 到生产代码的内部)
  3. 然后您将伪造 SUT,指定它应该 call the original (base) methods ,最后
  4. 显式覆盖您要拦截的方法的行为

关于unit-testing - 使用 FakeItEasy 模拟 SUT 的内部调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62517958/

相关文章:

nunit - 如何让 DevExpress CodeRush 使用 tm 模板而不是 VS 2010 中的 Microsoft 测试方法创建 NUnit 测试方法

c# - Moq 到 FakeItEasy 的迁移 - 如何迁移Verify()?

c# - 使用 FakeItEasy 创建类并自动初始化依赖项

java - 单元测试 Java 代码 - 模拟不同类的非静态方法

unit-testing - React/Redux 应用程序的单元测试

angularjs - angular.mock.module 和 angular.mock.inject 函数在 jasmine 的 beforeAll 中不起作用

c# - 为什么提取接口(interface)后可以替换底层实现?

nunit - Unity Nunit 和 Rhino 模拟

unit-testing - 非虚方法不能被拦截

javascript - 在 Dart 中测试性能