模拟对象列表

本文关键字:列表 对象 模拟 | 更新日期: 2023-09-27 18:06:59

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

据我所知,它并没有返回我在测试中创建的用户列表。我是否也需要模拟工作单元类中的存储库?还是仅仅嘲笑工作单元接口就足够了?如果有帮助的话,我可以发布更多的代码。

模拟对象列表

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

var mock = new Mock<IUnitOfWork>();
mock.Setup(It.IsAny<Func<User, bool>>(), null, ""), ...).Returns(...)
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)来检查参数。

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