【问题标题】:Testing Logger with Adapter Pattern使用适配器模式测试记录器
【发布时间】:2019-03-13 13:04:29
【问题描述】:

我有一个类,想测试方法是否被调用,记录器会记录。

public class LoggerAdapter<TheClassWhichHasTheMethod>: ILoggerAdapter<etc>

这是我制作的适配器。所以我在记录器类中有我正在使用和需要的方法,并将它们放在适配器记录器类中

public void MethodOne(param1, param2, param3, param4)

这个 void 方法自己调用适配器内部的下一个方法:

public void MethodTwo(param1, param2, param3, param4)

之后,日志记录完成。但是等等,还有更多。记录器正在执行其工作的方法如下:

 public async Task Execute()
    {
        await //some logic

        //some more logic
       Here the logger does its job: _logger.MethodOne(param1, param2, param3)
     //After logging finishes, more logic follows
    }

现在,适配器的接口需要扩展ILogger,因为我需要 ILogger 作为我的param 之一。问题是,在我完成Act 部分之后:

//await _classInstance.Execute();

由于我正在测试一个 void 方法,所以会有一些超时。好的,超时结束,但之后我不知道如何验证记录器是否已记录,即 _classInstance.Execute() 启动,记录器调用 MethodOne,后者调用 MethodTwo,然后它完成。

【问题讨论】:

    标签: c# .net unit-testing nunit adapter


    【解决方案1】:

    你知道我建议你使用库Moq。这个库有很酷的方法Verify,您可以在其中测试您的方法是否被调用。 你需要做这样的事情:

    var objectA = new Mock&lt;ObjectA&gt;();//ObjectA有Method1,Method2。 Method1、Method2必须是public virtual或者属于一个接口,所以ObjectA必须实现这个接口;

    然后objectA.Verify(o=&gt;o.Method1(), Times.Once);//和Method2一样。

    【讨论】:

    • @EdwardchoVaklinov 你有什么错误?在 Visual Studio 的测试资源管理器中,您可以检查测试失败的原因。请记住,您的方法必须是或在接口中,也不是公共虚拟的。这很重要
    • @Nolmagination 调用根本没有发生。但是当我调试它时,它会同时通过 MethodOne 和 MethodTwo。也许我将错误的对象作为参数传递?
    • @EdwardchoVaklinov 是的,很可能是这样。你应该在参数objectA.Verify(o=&gt;o.Method1(It.IsAny&lt;param1_type&gt;(), It.IsAny&lt;param2_type&gt;()........))中写这样的东西
    猜你喜欢
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多