无法在模拟对象上获取方法以返回虚假数据

时间:2012-11-17 12:50:05

标签: c# unit-testing moq

我正在尝试为“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中的

。 我究竟做错了什么?

1 个答案:

答案 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);

查看是否有效,然后重新添加用户名。