Moq验证升级到.NET Core 3.1后无法按预期工作

问题描述

顾名思义,这在.NET Core 2.2和Moq版本4.10.1中对我们有用。升级到.NET Core 3.1和Moq版本4.14.5后,verify方法将失败,表明尚未调用指定的方法(未对基础代码进行任何更改)。我将Moq回滚到4.10.1版本,只是为了查看是否是由于Moq新版本中的更改所致。我仍然遇到相同的错误。

尝试验证是否已将日志消息写入ILogger。

奇怪的是,如果我调试单元测试并使用变量表查看模拟对象,则表明该方法确实已被调用。

enter image description here

相关代码:

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方法。

下面是引发的异常。

enter image description here

注意::一个整数隐式转换为Microsoft.Extensions.Logging.EventId,这是ILogger.Log方法的第二个输入参数类型。

这些签名似乎与我匹配;所以我不确定为什么会说它没有被调用。

重申一下,此代码在升级到.NET Core 3.1之前有效,并且仍在我们预先创建的代码中有效。

此外,在有人建议需要设置该方法之前:没有该方法,它在升级之前就可以使用,而我已经尝试过了,但是没有用。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)