2017-02-14 1 views
0

함수가 매개 변수로 특정 대리자를 받았는지 테스트하고 싶습니다. 그것은 NSubstitute와 함께 NUnit에서 가능합니까?NSubstitute를 사용하여 함수가 특정 대리자를 받았는지 테스트하는 방법?

내 인터페이스 :

public interface IMyInterface 
{ 
    void Sort(Func<IEnumerable<int>, IOrderedEnumerable<int>> f); 
} 

내 테스트 클래스 :

[TestFixture] 
public class Class1 
{ 
    [Test] 
    public void Sort_WhenCalled_CallsWithPassedArgument() 
    { 
     // Arrange 
     IMyInterface mock = Substitute.For<IMyInterface>(); 

     // Act 
     mock.Sort(x => x.OrderBy(y => y)); 

     // Assert 
     mock.Received().Sort(x => x.OrderBy(y => y)); 
    } 
} 

또한 인자 매처 (matcher)와 시도했지만 항상 실패합니다.

+2

참고 [NS substitute - 특정 linq 표현식 테스트] (http://stackoverflow.com/questions/5654053/nsubstitute-testing-for-a-specific-linq-expression) –

+0

감사합니다. 그것은 내가 예상했던 것이 아니지만, 이제는 생각했던 것처럼 간단하지 않다는 것을 알고 있습니다. –

답변

0

귀하의 인수 유형은 Expression<Func<>>이 아닌 Func<>입니다. int 치의 6,4의 컬렉션을 제공하기 때문에, OrderByDescending() 반대로 표현하면이

그러나 메소드 이름 등을 확인하기 위해 트리를 검사 할 수있다, 당신은 OrderBy에 대한 구체적인 예에 ​​대한 단위 테스트 (예 : OrderBy()는 항상 다시 정렬 할 수 있습니다 그것을 4,6을 할 수있는 다음 작품 그래서 :. 당신은 당신이 정말로 정확한 방법은 FUNC에 사용 된 (그리고 아마 리팩토링하는지 테스트하려면 결정해야합니다, 그래서 물론

[TestFixture] 
    public class Class1 
    { 
    [Test] 
    public void Sort_WhenCalled_CallsWithPassedArgument() 
    { 
     // Arrange 
     IMyInterface mock = Substitute.For<IMyInterface>(); 

     Func<IEnumerable<int>, IOrderedEnumerable<int>> func = null; 
     mock.WhenForAnyArgs(x => x.Sort(Arg.Any<Func<IEnumerable<int>, IOrderedEnumerable<int>>>())).Do(
     x => 
      { 
      func = x.Arg<Func<IEnumerable<int>, IOrderedEnumerable<int>>>(); 
      }); 

     // Act 
     mock.Sort(x => x.OrderBy(y => y)); 

     // Assert 
     var result = func(new[] { 6, 4 }); 

     Assert.That(result.FirstOrDefault(), Is.Not.EqualTo(6)); 
     Assert.That(result.FirstOrDefault(), Is.EqualTo(4)); 
    } 
    } 

, 논리가 다소 약해 다른 방법으로이 특정 방법을 확인하거나 Expression으로 전환하도록 허용하는 코드) 또는 e 행동으로 충분합니다.

관련 문제