【发布时间】:2020-08-21 18:56:25
【问题描述】:
正如标题所暗示的,这在 .NET Core 2.2 和 Moq 版本 4.10.1 中适用于我们。升级到 .NET Core 3.1 和 Moq 版本 4.14.5 后,验证方法失败,说明未调用指定的方法(底层代码未更改)。我将 Moq 回滚到版本 4.10.1 只是为了看看它是否是由于新版本的 Moq 中的变化。我仍然遇到同样的错误。
尝试验证日志消息是否已写入 ILogger。
奇怪的是,如果我调试单元测试并使用变量 watch 查看模拟对象,它表明该方法确实已被调用。
相关代码:
public class AuditFilter, IResultFilter
{
...
public void OnResultExecuted( ResultExecutedContext context )
{
if( !IsContextValid( context ) )
{ return; }
...
}
public override bool IsContextValid( FilterContext context )
{
if( context == null )
{
Logger.Error( "Error writing to the audit log", new ArgumentNullException( nameof( context ) ) );
return false;
}
if( context.HttpContext == null )
{
Logger.LogError( "Error writing to the audit log", new ArgumentNullException( nameof( context.HttpContext ) ) );
return false;
}
return true;
}
public ILogger Logger { get; set; }
...
}
public class AuditTests : BaseTests
{
...
private Mock<ILogger> _mockLog;
private AuditFilter _filter;
[SetUp]
public void Setup()
{
_mockLog = new Mock<Microsoft.Extensions.Logging.ILogger>();
_mockLog.SetupAllProperties;
_filter = new AuditFilter();
}
[Test]
public void Service_Filters_Audit_IsContextValid_Context_Null()
{
var expected = false;
_filter.Logger = _mockLog.Object;
var actual = _filter.IsContextValid( null );
_mockLog.Verify( logger => logger.Log( LogLevel.Error,
It.IsAny<EventId>(),
It.IsAny<object>(),
It.IsAny<ArgumentNullException>(),
It.IsAny<Func<object, Exception, string>>() ),
Times.Once );
Assert.AreEqual( expected, actual );
}
...
}
注意:方法 ILogger.LogError 是微软对 ILogger 的扩展方法,它调用 ILogger.Log 方法。
注意:整数隐式转换为 Microsoft.Extensions.Logging.EventId,即 ILogger.Log 方法的第二个输入参数类型。
这些签名似乎与我相符;所以我不确定为什么它说它没有被调用。
重申一下,此代码在升级到 .NET Core 3.1 之前有效,并且在我们的预分叉代码中仍然有效。
另外,在有人建议需要设置该方法之前:在没有它的情况下升级之前它可以工作,我已经尝试过但它没有工作。
【问题讨论】:
-
你已经看过这个了吗? github.com/moq/moq4/issues/918
-
我看不到 _mockLog 的任何初始化
-
@SaiGummaluri,谢谢。该页面确实有我的解决方案。我在谷歌搜索时错过了它。如果您愿意,请将其作为答案提交,我会这样标记。我不得不更改验证方法调用中的最后一个参数 FROM: It.IsAny
>() TO: (Func -
@RoarS.,是的,我忽略了将它包含在上面列出的代码中。我会编辑帖子以包含它,但这不是问题。
-
@ELMOJO,很高兴它有所帮助:) 添加了围绕该问题的上下文及其推理,作为其他用户参考的答案。干杯!
标签: unit-testing asp.net-core .net-core moq