【问题标题】:How do I use Moq to validate Enterprise Library Logging?如何使用 Moq 来验证 Enterprise Library Logging?
【发布时间】:2012-06-28 13:05:57
【问题描述】:

我想创建一个单元测试来验证 Logger。Write 命令在我的一个 MVC 控制器中使用正确的消息执行。

我可以模拟 Logger 写入的 Listener,但我不知道如何访问存储的消息。例如,

var mockListener = new Mock<MyTraceListener>();
// the .Write method is void so I can't use .Returns() on my mock
mockListener.Setup(listener => listener.Write(It.IsAny<string>()))

MyController controller = new MyController();
MyController.Index();

//然后Index方法调用如下Logger.Write()到写入MyTraceListener的类别:

Logger.Write("test message", "MyCategory");

这个写入记录器的命令不会返回输入字符串或将其存储到一个参数中,以便我使用断言语句进行验证。我可以使用 Moq 验证或设置之一或 .when(无论是什么)函数来获取记录的消息,或者至少检查它是否已执行?

最好将日志条目存储到我的单元测试中的一个变量中,以便我可以断言:

Assert.AreEqual(loggedMessage, "test message");

如果有人知道这样做的策略,我将不胜感激。

【问题讨论】:

    标签: unit-testing testing logging moq enterprise-library


    【解决方案1】:

    假设您使用的是 Entlib 5.0,那么您已经有了一个模拟点。与其直接使用 Logger.Write,不如将 LogWriter 的实例注入到您的控制器中。然后,您可以在测试中模拟 LogWriter 对象。

    【讨论】:

      【解决方案2】:

      您希望使用回调作为一种将 Write 方法中的输入返回到单元测试的方法。

      由于 Loggers 是静态的,您必须封装对这些静态方法的调用才能在测试中使用 Moq。下面的示例类应该是你需要做的所有事情。您还必须更新代码以使用包装器,这可能会很痛苦。

      这是实现此目的的示例测试和类结构。

      public class Logger
      { 
         public virtual void Write( string message, string category )
         {
            Loggers.Write( message, category );
         }
      }
      
      [TestMethod]
      public void SampleTest()
      {
         string input = string.Empty;
      
         var mockLogger = new Mock<Logger>();
         mockLogger.Setup( l => l.Write( It.IsAny<string>(), It.IsAny<string>() ) ).Callback( ( string message, string category ) => input = message );
      
      
         mockLogger.Object.Write( "test", "category" );
      
         Assert.AreEqual( "test", input );
      }
      

      请注意,我使用的是最小起订量版本 4.0.10827.0。

      我希望这会有所帮助!

      【讨论】:

      • 这很有帮助。我可以将其配置为检测控制器源代码中的 Logger.Write 命令,而不是测试方法中的 mockLogger 吗?
      • 如果我理解您的要求正确,您需要设置模拟记录器并将其作为依赖项注入您的控制器,以便按照您想要的方式连接。
      • 这就是我希望避免的。我相当缺乏经验,这对我来说似乎不是一个好的编码习惯。
      • 依赖注入是一个强大的工具。它还可以让您编写最终同时测试多个层的测试。对于您的情况,您似乎正在这样做。如果您可以通过测试来验证日志记录行为,则无需在控制器层测试日志记录功能。
      • 我明白你在说什么。我可以有一个测试来验证日志记录功能,而另一个测试来验证我的控制器实际上执行了一些日志写入(不管它是否正确记录)。断言记录器写入被访问的最佳方法是什么?也许使用模拟记录器及其验证功能?编辑:我不能模拟 Loggers,因为它们是静态类。
      猜你喜欢
      • 2012-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-26
      • 1970-01-01
      相关资源
      最近更新 更多