问题描述
顾名思义,这在.NET Core 2.2和Moq版本4.10.1中对我们有用。升级到.NET Core 3.1和Moq版本4.14.5后,verify方法将失败,表明尚未调用指定的方法(未对基础代码进行任何更改)。我将Moq回滚到4.10.1版本,只是为了查看是否是由于Moq新版本中的更改所致。我仍然遇到相同的错误。
尝试验证是否已将日志消息写入ILogger。
奇怪的是,如果我调试单元测试并使用变量表查看模拟对象,则表明该方法确实已被调用。
相关代码:
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是Microsoft的ILogger扩展方法,它调用ILogger.Log方法。
注意::一个整数隐式转换为Microsoft.Extensions.Logging.EventId,这是ILogger.Log方法的第二个输入参数类型。
这些签名似乎与我匹配;所以我不确定为什么会说它没有被调用。
重申一下,此代码在升级到.NET Core 3.1之前有效,并且仍在我们预先创建的代码中有效。
此外,在有人建议需要设置该方法之前:没有该方法,它在升级之前就可以使用,而我已经尝试过了,但是没有用。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)