【问题标题】:Why did a Moq-mocked method return null?为什么 Moq 模拟方法返回 null?
【发布时间】:2010-12-19 20:47:39
【问题描述】:

当我尝试使用我的模拟 GetProfileFromUserName 方法时,它返回 null。一个名为GetEmail 的类似方法有效。

这是检索配置文件的代码,它不起作用:

mockUserRepository.Setup(gp => gp.GetProfileFromUserName(userProfile.UserName))
                  .Returns(new Profile { ProfileID = userProfile.ProfileID });

这是检索电子邮件的代码,有效。

mockUserRepository.Setup(em => em.GetEmail(new MockIdentity("JohnDoe").Name))
                  .Returns("johndoe@gmail.com");

这是模拟调用并返回 null 而不是配置文件的方法的 sn-p:

public ActionResult ShowProfile()
    {
        var profile = _userRepository.GetProfileFromUserName(User.Identity.Name);

我做错了什么?

如果我将 GetProfileFromUserName 中的 userProfile.UserName 替换为 It.IsAny();

【问题讨论】:

  • 如果你使用It.IsAny<string>()会发生什么?

标签: null moq


【解决方案1】:

如果返回 null,则表示您的 Setup 与实际调用不匹配。检查userProfile.UserName 在设置行是否包含正确的值。

此外,要检测不匹配的呼叫,请使用 MockBehavior.Strict 选项创建您的 mockUserRepository

希望这会有所帮助。

【讨论】:

  • 我碰巧使用了隐式强制转换运算符,因此方法已编译但最小起订量与调用不匹配。
【解决方案2】:

在我的例子中,错误是使用错误的签名初始化对象,即使代码已编译:

错误(参数类型为int):

_mockEntityServices.Setup(x => x.GetEntities(It.IsAny<int>()))
                   .Returns(new List<Entity>());

正确(参数类型为int?):

_mockEntityServices.Setup(x => x.GetEntities(It.IsAny<int?>()))
                   .Returns(new List<Entity>());

模拟方法的签名:

public IList<Entity> GetEntities(int? parentEntityId)

【讨论】:

  • 天啊!感谢您指出这一点。我遇到了类似的问题,并且因为无法确定原因而发疯:D
  • 就我而言,我将long 换成了int。很难发现
【解决方案3】:

对于任何试图返回在测试设置时不存在的对象(“排列”)的人,解决方案是使用委托 (Func) 重载:

mockUserRepository.Setup(gp => gp.GetProfileFromUserName(userProfile.UserName))
     .Returns(() => new Profile { ProfileID = userProfile.ProfileID });

【讨论】:

    【解决方案4】:

    我有一个类类型对象作为参数传递给 moq 方法。所以我用了

    mymockprovider.Setup(m=> m.getsomething(It.IsAny<myclasstype>())).Returns(testdata)
    

    【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-30
    • 2011-09-27
    相关资源
    最近更新 更多