为什么Moq-mocked方法返回null?

时间:2009-11-24 12:07:41

标签: null moq

我试图写一个测试方法需要帮助...

我需要测试用户是否可以显示他的个人资料,但是当我尝试使用我的模拟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而不是配置文件:

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

我做错了什么?如果我将GetProfileFromUserName中的userProfile.UserName替换为It.IsAny();

3 个答案:

答案 0 :(得分:13)

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

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

希望这有帮助。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

在我的情况下,错误是使用错误的签名初始化了对象,即使代码已编译:

错误(参数类型为 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)