使用myLambda()而不是其上的myLambda.Invoke()时,Moq安装失败。IsAny<&燃气轮机-方法组

使用myLambda()而不是其上的myLambda.Invoke()时,Moq安装失败。IsAny<&燃气轮机-方法组,moq,c#,Moq,C#,我使用了一个Util方法,它是一个扩展方法,延迟它的.*-调用,直到设置完成为止(使用存储在变量中的It.*-调用的结果似乎不起作用) 但是,我注意到,当我使用message()调用Func消息时,安装程序将无法正常工作。使用message.Invoke()时,它的工作原理与我预期的一样 据我所知,但为什么他们的行为会有所不同? 我确实相信这与Moq框架有关,这就是我为什么给它加上标签的原因。类似于Func f=()=>“test”;f()消息,()=>异常); } 公共静态无效调试(此模拟、

我使用了一个Util方法,它是一个扩展方法,延迟它的.*-调用,直到设置完成为止(使用存储在变量中的It.*-调用的结果似乎不起作用)

但是,我注意到,当我使用
message()
调用
Func消息时,安装程序将无法正常工作。使用
message.Invoke()
时,它的工作原理与我预期的一样

据我所知,但为什么他们的行为会有所不同?


我确实相信这与Moq框架有关,这就是我为什么给它加上标签的原因。类似于
Func f=()=>“test”;f()

以下示例:

public interface ILog 
{
    void Debug(string message, Exception exception = null);
}

public class LogUtils
{
    public static void Debug(this Mock<ILog> mock, string message, Exception exception = null)
    {
        mock.Debug(() => message, () => exception);
    }

    public static void Debug(this Mock<ILog> mock, Func<string> message, Func<Exception> exception)
    {
        // NOT working line
        mock.Setup(logger => logger.Debug(message(), exception()));

        // Working line
        mock.Setup(logger => logger.Debug(message.Invoke(), exception.Invoke()));
    }
}


// Test Method
public void TestMethod()
{
    Mock<ILog> logger = new Mock<ILog>(MockBehavior.Strict);

    // Setup logger to accept any input by using It.IsAny<>-MethodGroup
    logger.Debug(It.IsAny<string>, It.IsAny<Exception>);

    // Fails with no corresponding setup
    logger.Object.Debug("Test");
}
公共接口ILog
{
无效调试(字符串消息,异常=null);
}
公共类日志
{
公共静态void调试(此模拟、字符串消息、异常=null)
{
调试(()=>消息,()=>异常);
}
公共静态无效调试(此模拟、Func消息、Func异常)
{
//不工作线
mock.Setup(logger=>logger.Debug(message(),exception());
//工作线
mock.Setup(logger=>logger.Debug(message.Invoke(),exception.Invoke());
}
}
//试验方法
公共void TestMethod()
{
模拟记录器=新的模拟(MockBehavior.Strict);
//设置记录器以使用它接受任何输入。IsAny-MethodGroup
logger.Debug(It.IsAny,It.IsAny);
//失败,没有相应的设置
logger.Object.Debug(“测试”);
}

这似乎是一个错误。你想要达到的最终目标是什么?@Nkosi我读到
func()
func.Invoke()
是一样的(在去糖后)。我觉得不是。因为我只能用一种特定的方式来分解它,所以我的代码示例要大一点。重申这个问题:据我所知,
message()
应该是
message.Invoke()
的语法糖,但是为什么它们的行为不同呢?它们是相同的,但是
mock.Setup(logger=>logger.Debug(message(),exception())中的
func()
是一个表达式,而
func.Invoke()
在编译时表示表达式中的常量。这与Moq如何解释安装表达式有关。您尝试执行的操作不是安装预期用例的一部分
It.*()
不应该这样使用。它们是专门为在设置表达式中进行解释而创建的。不能用作变量。这就是为什么我问我原来的问题。延迟安装的目的是什么。@我不想每次都写
logger.setup(l=>l.Debug(…,…)
。我还有其他方法,它接受5个参数并返回一个结果。我希望将它捆绑到一个方法中,而不是一个到处都有大量重复的大代码块。通过实验,我发现使用
Func
延迟
It.*()
-执行是有效的。但后来我无意中发现了所谓平等陈述的区别,这似乎是一个错误。你想要达到的最终目标是什么?@Nkosi我读到
func()
func.Invoke()
是一样的(在去糖后)。我觉得不是。因为我只能用一种特定的方式来分解它,所以我的代码示例要大一点。重申这个问题:据我所知,
message()
应该是
message.Invoke()
的语法糖,但是为什么它们的行为不同呢?它们是相同的,但是
mock.Setup(logger=>logger.Debug(message(),exception())中的
func()
是一个表达式,而
func.Invoke()
在编译时表示表达式中的常量。这与Moq如何解释安装表达式有关。您尝试执行的操作不是安装预期用例的一部分
It.*()
不应该这样使用。它们是专门为在设置表达式中进行解释而创建的。不能用作变量。这就是为什么我问我原来的问题。延迟安装的目的是什么。@我不想每次都写
logger.setup(l=>l.Debug(…,…)
。我还有其他方法,它接受5个参数并返回一个结果。我希望将它捆绑到一个方法中,而不是一个到处都有大量重复的大代码块。通过实验,我发现使用
Func
延迟
It.*()
-执行是有效的。但后来我无意中发现了所谓平等陈述的区别。