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

Mar*_* M. 12 null moq

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

我需要测试用户是否可以显示他的个人资料,但是当我尝试使用我的模拟GetProfileFromUserName方法时遇到错误.方法返回null.我不明白的是,我有一个名为GetEmail的类似方法,它基本上做同样的工作.

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

mockUserRepository.Setup(gp => gp.GetProfileFromUserName(userProfile.UserName)).Returns(new Profile { ProfileID = userProfile.ProfileID });
Run Code Online (Sandbox Code Playgroud)

这是用于检索电子邮件的代码,该代码有效.

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

这是模拟调用的方法的片段,并返回null而不是配置文件:

public ActionResult ShowProfile()
    {
        var profile = _userRepository.GetProfileFromUserName(User.Identity.Name);
Run Code Online (Sandbox Code Playgroud)

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

Max*_*kin 14

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

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

希望这可以帮助.


Kar*_*arr 7

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

错误(参数类型为int):

_mockEntityServices.Setup(x => x.GetEntities(It.IsAny<int>()))
                   .Returns(new List<Entity>());
Run Code Online (Sandbox Code Playgroud)

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

_mockEntityServices.Setup(x => x.GetEntities(It.IsAny<int?>()))
                   .Returns(new List<Entity>());
Run Code Online (Sandbox Code Playgroud)

模拟方法的签名:

public IList<Entity> GetEntities(int? parentEntityId)
Run Code Online (Sandbox Code Playgroud)