【发布时间】:2017-12-26 13:02:34
【问题描述】:
我正在尝试为控制器操作编写一些单元测试。为此,我使用 XUnit 和 Moq。控制器在构造函数中注入了一个 ILoggerFactory。一个起订量如何进行测试?
我尝试为控制器类模拟一个 Logger,然后模拟 CreateLogger 以返回模拟 Logger,但是当调用 LogInformation() 函数时,我不断收到各种测试运行时 NullReferenceExceptions。
// Logger that yields only disappointment...
var mockLogger = new Mock<ILogger<JwtController>>();
mockLogger.Setup(ml => ml.Log(It.IsAny<LogLevel>(), It.IsAny<EventId>(), It.IsAny<object>(), It.IsAny<Exception>(), It.IsAny<Func<object, Exception, string>>()));
var mockLoggerFactory = new Mock<ILoggerFactory>();
mockLoggerFactory.Setup(mlf => mlf.CreateLogger("JwtController")).Returns(mockLogger.Object);
我假设问题是正在调用 LogInformation,这是一个扩展方法,那么如何起订量呢?
【问题讨论】:
-
我们通常将
ILogger<SampleController>注入控制器。注入ILoggerFactory的原因是什么? -
我可以试一试。它不会仍然使用扩展方法并因此仍然失败吗?
-
有效!如果我将注入的对象更改为 ILogger
,我可以使用“var mockLogger = new Mock >();”模拟记录器然后将 mockLogger.Object 传递给测试控制器。如果您@Win 发布答案,我很乐意接受。 -
由于问题被标记为重复问题虽然the duplicate answer 是一个死胡同,我无法再回答了。我很高兴它解决了问题。
-
@stuartd - 请允许 Win 打开这个问题以提交我可以接受的答案?
标签: c# unit-testing moq