C# 与最低起订量抗争:以下设置不匹配
我第一次使用Moq,我正在努力让测试正常运行 我正在尝试moq我的服务层的C# 与最低起订量抗争:以下设置不匹配,c#,unit-testing,moq,C#,Unit Testing,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) {
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();
}
//通过,但可能是可疑的
[测试]
public void应保存AnewUserFromExistingId()
{
//模拟“同步”
//设置
var userId=新Guid(“81C7FE19-2DB5-4083-BD6A-5433687561F7”);
var userModel=new userModel();
var userViewModel=newuserviewmodel{Id=userId};
var userRepository=new Mock();
var viewModelToModelMapper=new Mock();
var modelToViewModelMapper=new Mock();
//设置模拟用户存储库
Setup(r=>r.Create(It.Is(um=>um.Equals(userModel)));
viewModelToModelMapper.Setup(vmm=>vmm.BuildFrom(It.Is(u=>u.Equals(userViewModel)))
.Returns(userModel);
var userService=newuserservice(userRepository.Object、viewModelToModelMapper.Object、modeltomviewmodelmapper.Object);
//执行
userService.Save(userViewModel);
//断言
userRepository.VerifyAll();
viewModelToModelMapper.VerifyAll();
}
//通过,但可能是可疑的。
[测试]
public void ShouldSaveANewUser()
{
//模拟标准创建
//设置
var userId=Guid.Empty;
var userModel=new userModel();
var userViewModel=newuserviewmodel{Id=userId};
var userRepository=new Mock();
var viewModelToModelMapper=new Mock();
var modelToViewModelMapper=new Mock();
//设置模拟用户存储库
Setup(r=>r.Create(It.Is(um=>um.Equals(userModel)));
viewModelToModelMapper.Setup(vmm=>vmm.BuildFrom(It.Is(u=>u.Equals(userViewModel)))
.Returns(userModel);
var userService=newuserservice(userRepository.Object、viewModelToModelMapper.Object、modeltomviewmodelmapper.Object);
//执行
userService.Save(userViewModel);
//断言
userRepository.VerifyAll();
viewModelToModelMapper.VerifyAll();
}
//失败得很惨
[测试]
public void应保存一个现有用户()
{
//模拟“更新”
//设置
var userId=新Guid(“0A88AEC2-9F8D-44DE-BD01-3EB9A23C78E3”);
var userModel=newusermodel{Id=userId};
var userViewModel=newuserviewmodel{Id=userId};
var userRepository=new Mock();
var viewModelToModelMapper=new Mock();
var modelToViewModelMapper=new Mock();
//设置模拟用户存储库
Setup(r=>r.Update(It.Is(um=>um.Equals(userModel)));
viewModelToModelMapper.Setup(vmm=>vmm.BuildFrom(It.Is(u=>u.Equals(userViewModel)))
.Returns(userModel);
var userService=newuserservice(userRepository.Object、viewModelToModelMapper.Object、modeltomviewmodelmapper.Object);
//执行
userService.Save(userViewModel);
//断言
userRepository.VerifyAll();
viewModelToModelMapper.VerifyAll();
}
我的墨青哪里出了问题?似乎在最后一种情况下,您需要:
userRepository.Setup(r => r.GetById(userId)).Returns(userModel);
在userService.Save调用之前。如果没有它,userRepository.GetById将始终为null,并且永远不会执行更新分支。我没有尝试使用GetById,而是尝试“更新”是,但只有在GetById方法返回非null值时才会调用更新。由于尚未在存储库mock上设置GetById方法,因此它将返回一个默认值,对于引用类型,该值为null。然后,用户服务中的if语句的计算结果为false,并且不会调用更新。
// 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();
}
userRepository.Setup(r => r.GetById(userId)).Returns(userModel);