紧接着的是我们对IUserRepository接口所创建的Mock类,可以看一下我们很简单的处理了下GetUser方法,让TA返回一个指定值User对象。
1 public class MockUserRepository : IUserRepository 2 { 3 public List<Core.Models.User> GetUsers() 4 { 5 throw new NotImplementedException(); 6 } 7 8 public Core.Models.User GetUser(string Id) 9 { 10 return new User() { Id = "3277", Name = "Lanvige" }; 11 } 12 13 public void Save(Core.Models.User user) 14 { 15 throw new NotImplementedException(); 16 } 17 } |
下面的代码是真正的测试用例代码:
1 [TestClass] 2 public class UserServiceTest 3 { 4 private IUserRepository userRepository; 5 private UserService userService; 6 7 public UserServiceTest() 8 { 9 userRepository = new MockUserRepository(); 10 userService = new UserService(userRepository); 11 } 12 13 [TestMethod] 14 public void Get_User_By_Id_Test() 15 { 16 User user = this.userService.GetUser("3277"); 17 18 Assert.AreEqual("3277", user.Id); 19 Assert.AreEqual("Lanvige", user.Name); 20 } 21 } |
这样,我们就解决了在单元测试中的一些难题,而Mock的理念也得到充分展示,模拟真实对象的方法,返回所需的值,让测试变得更简单。
但上面的解决方案的实现还是很复杂的,接口我们需要自已动手写另一个实现类,实现接口中所有的方法,虽然有些我们并不需要。如果我们需要更多的验证时,就要去写更多的代码来实现,如判断代码是否被调用和调用次数,传入参数的正确性和忽略实参……