繁体   English   中英

Moq It.Is <>不匹配

[英]Moq It.Is<> not matching

这段代码:

hub.MockedUserRepository.Setup(r => r.Update(It.IsAny<ControllUser>()))
                        .Callback((ControllUser usr) => Console.WriteLine("NULL = " + (usr.Zombies[0].ConnectionId == null)))
                        .Verifiable();

会打印

NULL = True

所以我在想使用这种匹配会抓住它:

var zombieDisconnectParameterMatcher = It.Is<ControllUser>(x => x.Zombies[0].ConnectionId == null);
hub.MockedUserRepository.Setup(r => r.Update(zombieDisconnectParameterMatcher))
                        .Callback((ControllUser usr) => Console.WriteLine("NULL = " + (usr.Zombies[0].ConnectionId == null)))
                        .Verifiable();

但事实并非如此。

为什么?

通过查看It源代码, It与表达式树有关。 我喜欢这个问题; 他们可能很令人费解。 如果您要查看以下方法定义:

public static TValue It.Is<TValue>(Expression<Func<TValue, bool>> match)
{
        return Match<TValue>.Create(
                value => match.Compile().Invoke(value),
                () => It.Is<TValue>(match));
}

public static T Match.Create<T>(Predicate<T> condition, Expression<Func<T>> renderExpression)
{
        // ...
        return default(T);
}

如果您要执行以下行:

var zombieDisconnectParameterMatcher = It.Is<ControllUser>(x => x.Zombies[0].ConnectionId == null);

然后It.Is<ControllUser>()将尝试调用名为Match.Create<ControllUser>() ,该方法返回默认的ControllUser 我假设ControllUser是一个类,因此zombieDisconnectParameterMatcher将为null 您应该能够通过调试器看到这一点。 所以你实际上是在呼唤:

hub.MockedUserRepository.Setup(r => r.Update(null))
    .Callback((ControllUser usr) => Console.WriteLine("NULL = " + (usr.Zombies[0].ConnectionId == null)))
    .Verifiable();

使用非空ControllUser (例如,正在测试的方法)执行Update方法时,不会触发回调。 它根本不符合标准,因为它不是空的。 您也会看到验证失败。

要解决此问题,可以内联zombieDisconnectParameterMatcher变量,或使其成为表达式类型变量(例如, Expression<Func<...>> )。 后者将确保代码不被执行,但被视为模拟框架可以推理的表达式('是使用Zombies[0].ConnectionId == null ?来调用Update )。

这取决于ControllUser实例的实例化方式。 如果您在模拟中引用的实例不是测试代码中引用的实际实例,则Setup将失败。 您需要确保测试代码中引用的ControllUser实例与测试代码中的对象相同 如果不是,您将必须使用It.IsAny<ControllUser>()和回调测试它,如您的第一个示例所示。 如果没有看到您正在测试的更多代码,很难肯定地说。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM