2013-09-30 59 views
4

我第一次使用Moq,並且我正在努力使測試正常運行。與Moq掙扎:下面的設置不匹配

我試圖moq Save()我的服務層的方法。

public void Save(UserViewModel viewModel) 
{ 
    // todo: this still doesn't address updating a password. The UserViewModel doesn't contain any Password data. 
    if (viewModel.Id != Guid.Empty) 
    { 
     // The UserId is not empty, we're either updating an existing user 
     // or we're inserting a new user via sync 
     var user = _userRepository.GetById(viewModel.Id); 
     if (user != null) 
     { 
      // Looks like we're updating a user because they're already in the database. 
      _userRepository.Update(_userViewModelToModelMapper.BuildFrom(viewModel)); 
      return; 
     } 
    } 

    // The user is being created, either via a Sync (Guid Exists), or via an Insert (Guid doesn't Exist) 
    _userRepository.Create(_userViewModelToModelMapper.BuildFrom(viewModel)); 
} 

我有三個測試,其中,的我不知道任何人都正確。前兩種是路過,但第三個失敗,

Moq.MockVerificationException:下面設置不匹配:
IUserRepository R => r.Update(It.Is(UM => um.Equals( )))

這裏是測試。

// PASSES but could be suspect 
[Test] 
public void ShouldSaveANewUserFromExistingId() 
{ 
    // emulating a "sync" 

    // Setup 
    var userId = new Guid("81C7FE19-2DB5-4083-BD6A-5433687561F7"); 
    var userModel = new UserModel(); 
    var userViewModel = new UserViewModel {Id = userId}; 
    var userRepository = new Mock<IUserRepository>(); 
    var viewModelToModelMapper = new Mock<IAutoMapper<UserViewModel, UserModel>>(); 
    var modelToViewModelMapper = new Mock<IAutoMapper<UserModel, UserViewModel>>(); 

    // Setup the Mock UserRepository 
    userRepository.Setup(r => r.Create(It.Is<UserModel>(um => um.Equals(userModel)))); 

    viewModelToModelMapper.Setup(vmm => vmm.BuildFrom(It.Is<UserViewModel>(u => u.Equals(userViewModel)))) 
      .Returns(userModel); 

    var userService = new UserService(userRepository.Object, viewModelToModelMapper.Object, modelToViewModelMapper.Object); 

    // Execute 
    userService.Save(userViewModel); 

    // Assert 
    userRepository.VerifyAll(); 
    viewModelToModelMapper.VerifyAll(); 
} 
// PASSES but could be suspect. 
[Test] 
public void ShouldSaveANewUser() 
{ 
    // emulating a standard create 

    // Setup 
    var userId = Guid.Empty; 
    var userModel = new UserModel(); 
    var userViewModel = new UserViewModel { Id = userId }; 
    var userRepository = new Mock<IUserRepository>(); 
    var viewModelToModelMapper = new Mock<IAutoMapper<UserViewModel, UserModel>>(); 
    var modelToViewModelMapper = new Mock<IAutoMapper<UserModel, UserViewModel>>(); 

    // Setup the Mock UserRepository 
    userRepository.Setup(r => r.Create(It.Is<UserModel>(um => um.Equals(userModel)))); 

    viewModelToModelMapper.Setup(vmm => vmm.BuildFrom(It.Is<UserViewModel>(u => u.Equals(userViewModel)))) 
      .Returns(userModel); 

    var userService = new UserService(userRepository.Object, viewModelToModelMapper.Object, modelToViewModelMapper.Object); 

    // Execute 
    userService.Save(userViewModel); 

    // Assert 
    userRepository.VerifyAll(); 
    viewModelToModelMapper.VerifyAll(); 

} 
// FAILS MISERABLY 
[Test] 
public void ShouldSaveAnExistingUser() 
{ 
    // emulating an "Update" 

    // Setup 
    var userId = new Guid("0A88AEC2-9F8D-44DE-BD01-3EB9A23C78E3"); 
    var userModel = new UserModel { Id = userId }; 
    var userViewModel = new UserViewModel { Id = userId }; 
    var userRepository = new Mock<IUserRepository>(); 
    var viewModelToModelMapper = new Mock<IAutoMapper<UserViewModel, UserModel>>(); 
    var modelToViewModelMapper = new Mock<IAutoMapper<UserModel, UserViewModel>>(); 

    // Setup the Mock UserRepository 
    userRepository.Setup(r => r.Update(It.Is<UserModel>(um => um.Equals(userModel)))); 

    viewModelToModelMapper.Setup(vmm => vmm.BuildFrom(It.Is<UserViewModel>(u => u.Equals(userViewModel)))) 
      .Returns(userModel); 

    var userService = new UserService(userRepository.Object, viewModelToModelMapper.Object, modelToViewModelMapper.Object); 

    // Execute 
    userService.Save(userViewModel); 

    // Assert 
    userRepository.VerifyAll(); 
    viewModelToModelMapper.VerifyAll(); 
} 

我在哪裏我Moqing回事?

回答

4

好像在最後一種情況下,你將需要:

userRepository.Setup(r => r.GetById(userId)).Returns(userModel); 

的userService.Save電話之前。沒有它userRepository.GetById將始終爲空,更新分支將永遠不會被採取。

+0

我不想GetById,我試圖「更新」 –

+2

是的,但只有在GetById方法返回非空值時纔會調用更新。由於您尚未在存儲庫模擬上設置GetById方法,因此它將返回一個默認值,其中引用類型爲null。用戶服務中的if語句然後評估爲false,並且更新不會被調用。 –

+0

哦,我現在明白了......很酷。 –