2013-10-02 4 views
0

내 단위 테스트에서 Moq을 사용하고 있으며, 내 테스트가 실패한 이유를 알 수 없습니다. 여기 모의 테스트가 실패한 곳을 찾을 수 없습니다.

내가

Moq.MockVerificationException을지고있어 오류의 다음 설정이 일치하지 않은 :
IGroupRepository R => r.Delete (It.Is (음 => 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를 주입 경우 테스트를 통과, 밖으로 알아낼 수 없습니다 것은. 기본적으로 매핑되는 서비스 모델과 일대일 방식이므로 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>>(); 

} 

누군가가 나를 조롱하는 것을 도와 줄 수 있습니까?

+0

랜덤 추측 - 테스트 에서처럼 명시 적으로 반환되는 대신 모델이 생성 될 때'Equals'는 값으로 객체를 비교하지 않으며'um => um.Equals (_groupModel)'는 실패합니다. –

+0

그래서 modelMappers를 삽입했지만 서비스 생성자에서 인스턴스화하면 통과하지 않는 이유는 무엇입니까? –

+0

'_groupModel.(_groupModel)은 디폴트 포인터 비교 (_groupModel을 단순히 반환하는 매퍼를 삽입 할 때 일어나는 일)와 동일하지만'_groupModel.Equals (new Model (fromSomeData))'는 항상 기본 포인터 비교를 실패합니다 ... –

답변

1

AutoMapper를 포함한 모든 것을 조롱 할 때 기준 비교를 사용하는 것으로 충분했습니다. 그것을 조롱하고 그것을를 주입하지 우리는 실제로하여 AutoMapper 을 사용하고 있는지 이제

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

, 나는 값 비교를해야했다.

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

이렇게하면 문제가 해결됩니다.

+0

그건 정확히 내가 의미하는 바 ... lazyberezovsky는 프로젝트의 나머지 부분에서 필요로하는 좋은 제안을하고있다. (GroupModel을 더 다루고 싶다면 more) 같은 가치 유형). 그냥 모의 경우 - 하나의 흥미로운 속성을 비교하는 것은 완벽하게 유효한 접근법입니다. –

+0

고마워요 @AlexeiLevenkov ... 그것은 조금 생각을했다. 오늘 너무 오래 화면을 쳐다보고있다 –

2

GroupModel 클래스의 Equals (및 GetHashCode)을 무시하면 테스트가 통과됩니다. 기본적으로 Equals은 개체 참조를 기반으로 비교를 사용합니다. 따라서 두 개의 다른 인스턴스 (_groupModel과 매퍼로 빌드 된 인스턴스)가 있습니다. Equals은 false를 반환합니다.

지나가는 예제에서 정확히 동일한 인스턴스 _groupModel을 비교 중이므로 Equals이 true를 반환합니다.

+0

"수도 있습니다 "같음"Equals "과"GetHashCode "가 비슷합니까? –

+1

@ChaseFlorell Equals는 인스턴스를 동일하게 취급하는 논리를 구현해야합니다. 간단한 ID 비교 또는 모든 필드의 비교 일 수 있습니다. [해시 코드 생성은 좀 더 까다 롭습니다] (http://stackoverflow.com/questions/263400/what-is-the-best-algorithm-for-an-overridden-system-object-gethashcode) Equals에서 비교할 여러 값을 사용할 때 (id 만 사용하는 경우) equ 그렇다면 객체 해시 코드에 id.GetHashCode를 사용할 수 있습니다. –

관련 문제