C# 如何模拟输入为异常的函数?

C# 如何模拟输入为异常的函数?,c#,unit-testing,exception,.net-core,mocking,C#,Unit Testing,Exception,.net Core,Mocking,我正在用.netcore C#编写一个函数的单元测试。在该函数中,我需要为mock对象设置一个函数。此函数的have input是一个例外。我尝试下面的解决方案,它可以编译,但在运行时失败。请帮忙 需要测试功能: public void MyFunction() { ... try { ... } catch (Exception ex) {

我正在用.netcore C#编写一个函数的单元测试。在该函数中,我需要为mock对象设置一个函数。此函数的have input是一个例外。我尝试下面的解决方案,它可以编译,但在运行时失败。请帮忙

需要测试功能:

    public void MyFunction()
    {
        ...
        try
        {
            ...
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "...");
            ...
        }
    }
在单元测试中,我按照以下方式进行设置:

_loggerMock.Setup(l => l.LogError(It.IsAny<Exception>(), It.IsAny<string>(), null));
\u loggerlock.Setup(l=>l.LogError(It.IsAny(),It.IsAny(),null));
运行UT时出错:

System.NotSupportedException:'不支持的表达式:l=>l.LogError(It.IsAny(),It.IsAny(),new[]{}) 在设置/验证表达式中不能使用扩展方法(此处:LoggerExtensions.LogError)。'


我遵循了Simple Ged评论中的指导原则。现在它可以工作了

代码如下:

_loggerMock.Setup(x => x.Log(LogLevel.Error, It.IsAny<EventId>(), It.IsAny<object>(), It.IsAny<Exception>(), It.IsAny<Func<object, Exception, string>>()));
\u loggerlock.Setup(x=>x.Log(LogLevel.Error,It.IsAny(),It.IsAny(),It.IsAny(),It.IsAny());

LogError
是一种扩展方法。您需要模拟
ILogger
界面上的
Log(…)
方法。我也尝试过这个方法,但不适用于我。我通过调试确认,测试中的代码多次调用了
logger.LogError(例如,“错误消息”)
,但如果我尝试验证调用次数,它会告诉我根本没有调用它。。。调用.Verify():
loggerlock.Verify(x=>x.Log(LogLevel.Error,It.IsAny(),It.IsAny(),It.IsAny(),It.IsAny()),Times.atleastone)