在Moq中苦苦挣扎:以下设置不匹配

时间:2013-09-30 21:24:28

标签: c# unit-testing 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();
}

我的莫青在哪里出错?

1 个答案:

答案 0 :(得分:10)

看起来像你需要的最后一种情况:

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

在userService.Save调用之前。没有它,userRepository.GetById将始终为null,并且永远不会采用更新分支。