3

我正在学习如何编写单元测试并且有点坚持使用 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));

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

4

3 回答 3

1

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

var mock = new Mock<IUnitOfWork>();
mock.Setup(It.IsAny<Func<User, bool>>(), null, ""), ...).Returns(...)
于 2013-04-02T15:44:04.480 回答
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)检查参数。

于 2013-04-02T15:40:58.493 回答
0

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

于 2013-04-02T15:42:39.460 回答