2017-03-02 1 views
0

프로젝트 단위 테스트를하고 있는데 NS substitute가 예상대로 작동하도록하는 방법을 알아낼 수 없습니다. 내가 가지고있는 문제는 내가 대체해야 할 코드가 while 루프에 있고 대체 값에서 반환되는 값에 따라 루프가 계속 진행되는지 여부가 결정된다는 것입니다. 내가하고 싶은 무엇NSubstitue에서 IEnumerable을 사용하는 어셈블러 정규 표현식

는 전달 내용에 따라 다른 결과를() 프로세스를 반환합니다. 내가

api.Process(Arg.Is<IEnumerable<int>>(new[] {1,2,3}, Arg.Any<bool>()).Returns(new ProcessingResult(){Success = true, IdsNotProcessed = List<int>{30}}); 

을 시도했지만이 processingResult로 작동하는 것 같다하지 않습니다 온다 다시 널 NSubstitue 때문에 인수와 일치하지 않습니다.

[Test] 
    public void TestTwoLoops() 
    { 
     var api = Substitute.For<IApi>(); 
     api.Process(/*list containing 1,2,3*/, Arg.Any<bool>()).Returns(new ProcessingResult(){Success = true, IdsNotProcessed = List<int>{30}}); 
     api.Process(/*list containing 30*/, Arg.Any<bool>()).Returns(new List<int>{}); 

     var sut = new WidgetMaker(api); 

     sut.MakeWidget(); 
    } 

    public class WidgetMaker 
    { 
     public WidgetMaker(IApi api) 
     { 
      _api = api; 
     } 

     public void MakeWidgets(IEnumerable<int> widgetIds) 
     { 
      var idsToProcess = widgetIds.ToList(); 

      while(true) 
      { 
       if(!idsToProcess.Any()) 
       { 
        berak; 
       } 

       var processingResult = _api.Process(idsToProcess, false); 

       if(processingResult.Success) 
       { 
        idsToProcess.Clear(); 
        idsToProcess.AddRange(processingResult.IdsNotProcessed); 
       } 
       else 
       { 
        break; 
       } 
      } 
     } 

     private IApi _api; 
    } 

답변

1

이 질문을 쓰면서 답변이 나에게 돌아 왔지만 다른 사람들이 도움이 될 것 같은 느낌이 들었습니다.

술어 허용 과부하를 사용하여 {I 입력 할 수/값 /} 새로운 []의 파라미터

api.Process(Arg.Is<IEnumerable<int>>(x => x.SequenceEqual(new[] {1,2,3}, Arg.Any<bool>())).Returns(new ProcessingResult(){Success = true, IdsNotProcessed = List<int>{30}}); 
으로 SequenceEqualExtension 방법을 이용하여