2013-09-30 3 views
4

저는 처음으로 Moq을 사용하고 있습니다. 테스트를 제대로 실행하는 데 어려움을 겪고 있습니다.Moq로 고투 : 다음 설정은 일치하지 않았습니다

나는 서비스 계층의 Save() 메서드를 moq하려고 시도하고있다.

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을 ()))

다음은 테스트입니다.

// 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(); 
} 

// 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(); 

} 
내 Moqing으로 잘못된 것입니까?

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

을 userService.Save 호출하기 전에 마지막으로 경우에 당신이 필요로하는 것처럼

답변

4

보인다. 그것이 없으면 userRepository.GetById는 항상 null이되고 업데이트 분기는 절대 수행되지 않습니다.

+0

GetById를 시도하지 않고 있는데, "업데이트"하려고합니다. –

+2

예, GetById 메서드가 null이 아닌 값을 반환하는 경우에만 업데이트가 호출됩니다. 저장소 모의 객체에서 GetById 메소드를 설정하지 않았으므로 참조 유형에 대해 null 인 기본값을 리턴합니다. 그런 다음 사용자 서비스의 if 문은 false로 평가되고 업데이트가 호출되지 않습니다. –

+0

오, 이제 이해합니다. –

관련 문제