0

単体テストで 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 を注入すると、テストがパスするということです。オートマッパーは基本的にマッピング対象のサービス モデルと 1 対 1 であるため、オートマッパーを注入する意味がわかりません。

サービス

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

}

誰かがこの嘲笑のコツをつかむのを手伝ってくれませんか?

4

2 に答える 2

2

Equalsクラスの(およびGetHashCode) をオーバーライドするだけGroupModelで、テストに合格します。デフォルトでEqualsは、オブジェクトの参照に基づく比較が使用されます。したがって、2 つの異なるインスタンス (_groupModel とマッパーによって作成されたもの)があると、 Equalsfalse が返されます。

渡す例では、まったく同じインスタンス _groupModel を比較しているため、Equalstrue を返します。

于 2013-10-02T23:59:59.843 に答える
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 ) ));

これで問題は解決します。

于 2013-10-02T23:58:55.817 に答える