2017-12-13 36 views
0

이 코드를 가지고 있으며 opts.Items["foo"]이 올바르게 설정되었는지 테스트하려고합니다. 올바른 작업 옵션으로 AutoMapper가 호출되는지 테스트하는 테스트를 작성하는 방법

public Result DoStuff(MyInput myObj) 
{ 
    var mapped = _mapper.Map<Result>(myObj, 
     opts => 
     { 
      opts.Items["foo"] = "bar"; 
     }); 
    return mapped; 
} 

그리고 내 테스트 지금이 작동하지 않고 내가 옳은 길 :(

내가하지 않습니다에있어 모르겠어요이

public void MapperShouldBeCalledWithCorrectOperationItems() 
{ 
    // Arrange 
    var optObj = Substitute.For<IMappingOperationOptions>(); 
    Action<IMappingOperationOptions> argumentUsed = null; 
    _mapper.Received().Map<Result>(result, Arg.Do<Action<IMappingOperationOptions>>(arg => argumentUsed = arg)); 

    // Act 
    _uut.DoStuff(new MyInput()); 
    argumentUsed.Invoke(optObj); 

    // Assert 
    optObj.Items["foo"].Should().Be("bar"); 
} 

처럼 보인다 나는 내가 대신 IMappingOperationOptionsItems["foo"]가 설정되어 있는지 확인해야 람다를 검사 할 수 있다고 생각합니다.

어떤 제안?

+0

테스트하려는 정확한 방법은 어떻게됩니까? 첫 번째 코드는 메서드가 아니라 코드 블록입니다. – Evk

+0

@Evk 수정 된 게시물, 잘하면 그것은 조금 더 명확하게 –

+0

하지만 당신은 당신의 대체 된 매퍼를'_uut' 클래스에 넘겨주지 않습니다. 그래서 그냥 보통의'_mapper'를 사용합니다. – Evk

답변

0

나는 그것을 이해했다!

public void MapperShouldBeCalledWithCorrectOperationItems() 
{ 
    // Arrange 
    var optObj = Substitute.For<IMappingOperationOptions>(); 

    Action<IMappingOperationOptions> argumentUsed = null; 
    _mapper 
     .Map<Result>(Arg.Any<Result>, 
        Arg.Do<Action<IMappingOperationOptions>>(arg => argumentUsed = arg)); 

    // Act 
    _uut.DoStuff(new MyInput()); 
    argumentUsed.Invoke(optObj); 

    // Assert 
    optObj.Items["foo"].Should().Be("bar"); 
}