找不到我的模拟测试失败的地方

时间:2013-10-02 21:39:56

标签: c# unit-testing mocking moq

我在单元测试中使用Moq,我无法弄清楚为什么我的测试失败。

这是我得到的错误

  

Moq.MockVerificationException:以下设置未匹配:
  IGroupRepository r => r.Delete(It.Is(um => um.Equals()))

这是我正在尝试测试的服务。

服务

public GroupService ( IGroupRepository groupRepository )
{
    _groupModelToViewModelMapper = new AutoMapper<GroupModel, GroupViewModel>();
    _groupViewModelToModelMapper = new AutoMapper<GroupViewModel, GroupModel>();
    _groupRepository = groupRepository;
}

public void Delete( GroupViewModel viewModel )
{
    _groupRepository.Delete( _groupViewModelToModelMapper.BuildFrom( viewModel ) );
}

测试

[Test]
public void FAILING_TEST ()
{
    // Setup the Mock GroupRepository
    _groupRepository.Setup( r => r.Delete( It.Is<GroupModel>( um => um.Equals( _groupModel ) ) ) );

    var groupService = new GroupService( _groupRepository.Object);

    // execute
    groupService.Delete( _groupViewModel );

    // assert
    _groupRepository.VerifyAll();
}

我无法弄清楚的是,如果我注入AutoMapper,测试就会通过。我没有看到注入自动播放器的重点,因为它基本上与它映射的服务模型一对一。

服务

public GroupService( IGroupRepository groupRepository,
                     IAutoMapper<GroupViewModel, GroupModel> groupViewModelToModelMapper,
                     IAutoMapper<GroupModel, GroupViewModel> groupModelToViewModelMapper )
{
    _groupModelToViewModelMapper = groupModelToViewModelMapper;
    _groupRepository = groupRepository;
    _groupViewModelToModelMapper = groupViewModelToModelMapper;
}

public void Delete( GroupViewModel viewModel )
    {
        _groupRepository.Delete( _groupViewModelToModelMapper.BuildFrom( viewModel ) );
    }

测试

[Test]
public void PASSING_TEST()
{
    // Setup the Mock GroupRepository
    _groupRepository.Setup(r => r.Delete(It.Is<GroupModel>(um => um.Equals(_groupModel))));

    // Setup the Mock ModelMapper
    _viewModelToModelMapper.Setup(vmm => vmm.BuildFrom(It.Is<GroupViewModel>(u => u.Equals(_groupViewModel))))
                          .Returns(_groupModel);

    var groupService = new GroupService(_groupRepository.Object, _viewModelToModelMapper.Object, _modelToViewModelMapper.Object);

    // execute
    groupService.Delete(_groupViewModel);

    // assert
    _groupRepository.VerifyAll();
    _viewModelToModelMapper.VerifyAll();
}

此外,如果它有效,这是测试设置。

private GroupModel _groupModel;
private List<GroupModel> _groupModels;
private GroupViewModel _groupViewModel;
private List<GroupViewModel> _groupViewModels;
private Mock<IGroupRepository> _groupRepository;
private Mock<IAutoMapper<GroupViewModel, GroupModel>> _viewModelToModelMapper;
private Mock<IAutoMapper<GroupModel, GroupViewModel>> _modelToViewModelMapper;


[SetUp]
public void SetUp()
{
    _groupModel = new GroupModel();
    _groupModels = new List<GroupModel>();
    _groupViewModel = new GroupViewModel();
    _groupViewModels = new List<GroupViewModel>();
    _groupRepository = new Mock<IGroupRepository>();
    _viewModelToModelMapper = new Mock<IAutoMapper<GroupViewModel, GroupModel>>();
    _modelToViewModelMapper = new Mock<IAutoMapper<GroupModel, GroupViewModel>>();

}

有人可以帮我解决这个嘲弄事吗?

2 个答案:

答案 0 :(得分:2)

只需覆盖Equals课程的GetHashCode(和GroupModel),您的考试即可通过。默认情况下,Equals使用基于对象引用的比较。因此,您有两个不同的实例(_groupModel和一个由mapper构建)Equals返回false。

在您的传递示例中,您正在比较完全相同的实例_groupModel,因此Equals返回true。

答案 1 :(得分:1)

当我嘲笑包括AutoMapper在内的所有内容时,使用参考比较就足够了。

_groupRepository.Setup( r => r.Delete( It.Is<GroupModel>( um => um.Equals( _groupModel ) ) ) );

现在我们实际上正在使用AutoMapper 而不是嘲笑它并注入它,我必须进行值比较。

_groupRepository.Setup( r => r.Delete( It.Is<GroupModel>( um => um.Id == groupId ) ));

这解决了这个问题。