模拟对象列表

时间:2013-04-02 15:36:32

标签: c# unit-testing moq

我正在学习如何编写单元测试,并且有点坚持使用Mocks。我正在使用Moq进行嘲弄。我正在使用VS 2012附带的内置测试框架。如果更好(并且可以解决我的问题),我可以切换到NUnit。我有一个单位的工作模式设置。我正在测试的方法是重置用户的密码。我告诉Moq根据我正在测试的方法调用的唯一代码返回用户列表:

var mock = new Mock<IUnitOfWork>();
        mock.Setup(u => u.UserRepository.Get(t => t.PassResetCode.Equals("test1"), null, "")).Returns(
            new List<User>
        {
            new User { UserId = 4, FirstName = "Test4", LastName = "LastName", Email = "test4@test.com", Salt = salt, Password = pass, AccountConfirmed = true, PassResetCode = "test1", PassResetExpire = new Nullable<DateTime>(DateTime.Now.Add(ts)) },                
        });

在我测试的方法中,它调用以下内容:

var users = unitOfWork.UserRepository.Get(u => u.PassResetCode.Equals(code));

据我所知,它并没有返回我在测试中创建的用户列表。我是否还需要在工作单元类中模拟存储库?或者只是嘲笑工作单元界面呢?如果有帮助,我可以发布更多代码。

3 个答案:

答案 0 :(得分:1)

您的存储库接受委托,并且您期望期望特定委托t => t.PassResetCode.Equals("test1")。我认为mock里面会将传递的谓词与此委托进行比较。不同的委托实例与99.99%的概率不匹配。您应该避免在此特定期望中为谓词设置特定约束,而是使用It.IsAny<>()

var mock = new Mock<IUnitOfWork>();
mock.Setup(It.IsAny<Func<User, bool>>(), null, ""), ...).Returns(...)

答案 1 :(得分:0)

var mock = new Mock<IUnitOfWork>();
        mock.Setup(u => u.UserRepository.Get("test1", null, "")).Returns(
            new List<User>
        {
            new User { UserId = 4, FirstName = "Test4", LastName = "LastName", Email = "test4@test.com", Salt = salt, Password = pass, AccountConfirmed = true, PassResetCode = "test1", PassResetExpire = new Nullable<DateTime>(DateTime.Now.Add(ts)) },                
        });

您必须确保准确传递这些参数。或者,您可以将语法It.IsAny<TYPE>()用于您不关心的任何参数。或者您可以It.Is<TYPE>(condition)检查参数。

答案 2 :(得分:0)

假设您正在使用Moq,问题是setup方法不能处理这样的lambdas。您需要使用It.IsAny<Func<T, bool>> ()作为第一个参数。