我试图写一个测试方法需要帮助...
我需要测试用户是否可以显示他的个人资料,但是当我尝试使用我的模拟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();
答案 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)