我正在尝试为“MethodToTest”编写测试,如下所示
Public Class UserService()
{
private IRepository<User> _userRepo;
public UserService(IRepository<User> userRepo = null)
{
_userRepo = userRepo ?? new UserRepository();
}
public List<string> MethodToTest(string userName)
{
var user = _userRepo.Find(u => u.Email == userName).First<User>();
//Other stuff that eventually returns a List<string>
}
}
我的测试中有以下内容
[Test]
public void GetItemsByUserName_UserName_ListOfItems()
{
var userName = "AnyString";
var fakeUserRepo = new Mock<IRepository<User>>();
var fakeUserList = new List<User>()
{
new User()
{
Email = userName,
Roles = new List<Role>()
{
new Role()
{
Name="Role1"
},
new Role()
{
Name="Role2"
}
}
}
};
var fakeUserListQueryable = fakeUserList.AsQueryable<User>();
var query = new Func<User, bool>(u => u.Email == userName);
fakeUserRepo.Setup(u => u.Find(query)).Returns(fakeUserListQueryable);
var userService = new UserService(fakeUserRepo.Object);
var menu = userService.GetMenuByUserName(userName);
//Assert Something
}
问题是我无法获取_userRepo的find方法来返回我的虚假用户列表。
运行测试时,执行
时会出现“序列包含无元素”_userRepo.Find(u => u.Email == userName).First<User>();
MethodToTest中的。 我究竟做错了什么?
答案 0 :(得分:1)
我认为Func<User, bool>
上存在平等问题。如您所知,如果query
等于您调用的代码中的实际Func,Moq将设置fakeUserRepo。但是,您在设置代码中创建了new Func<User, bool>
。因此,当Moq检查相等性时,它会检查两种不同的引用类型,因此不会设置期望值。
我会尝试这样的事情:
fakeUserRepo.Setup(u => u.Find(It.IsAny<Func<User, bool>>())).Returns(fakeUserListQueryable);
查看是否有效,然后重新添加用户名。