代码之家  ›  专栏  ›  技术社区  ›  Chase Florell

与Moq斗争:以下设置不匹配

  •  13
  • Chase Florell  · 技术社区  · 11 年前

    我是第一次使用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 回复  |  直到 11 年前
        1
  •  15
  •   Jesse Sweetland    11 年前

    似乎在最后一种情况下,您需要:

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

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