2017-01-18 18 views
2

수익률 반환을 사용하는 프로젝트에서 MSTest가 전달되는 동안 XUnit이 단위 테스트에서 예외를 catch하지 못하는 이유를 이해할 수 없습니다.XUnit 및 MSTest와 ExpectedException이 다른 결과 반환

내 더미 코드입니다.

이상한 점은 개인 메서드 인 EnumerableYieldReturn을 사용하여 논리를 직접 공용 메서드 인 YieldReturnList에 넣으면 XUnit 테스트가 통과되고 MSTest가 실패하는 것입니다.

[TestClass] 
public class MSTestRunner 
{ 
    [TestMethod] 
    [ExpectedException(typeof(ArgumentException))] 
    public void MSTestUsingExpectedException() 
    { 
     var sut = new YieldReturn(); 

     sut.YieldReturnList(null); 
    } 
} 

public class XUnitRunner 
{ 
    [Fact] 
    [ExpectedException(typeof(ArgumentException))] 
    public void XUnitUsingExpectedException() 
    { 
     var sut = new YieldReturn(); 

     sut.YieldReturnList(null); 
    } 
} 

public class YieldReturn 
{ 
    public IEnumerable<string> YieldReturnList(int? value) 
    { 
     if (value == null) 
      throw new ArgumentException(); 

     return EnumerableYieldReturn((int)value); 
    } 

    private IEnumerable<string> EnumerableYieldReturn(int value) 
    { 
     var returnList = new List<string>() { "1", "2", "3" }; 

     for (int i = 0; i < value; i++) 
     { 
      yield return returnList[i]; 
     } 
    } 
} 

... 나는 sut.YieldReturnList의 반환 객체를 할당하고 그것을 통해 반복을 시도하여 전달하는 모두를 얻을 수 있지만, 하나의 프레임 워크를 통과하고, 다른 하나는 실패하는 이유는 설명하지 않습니다

답변

3

"xUnit.net은 Assert.Throws를 위해 ExpectedException 속성을 제거했습니다." https://xunit.github.io/docs/comparisons.html에서.

결과의 플립 이유는 예외가 더 이상 때문에 발생되는 없습니다 :

MSTEST : 그것은 예외를하지 않기 때문에이 속성을 사용하므로 실패하기 때문에 예외를 기대

XUnit : 프레임 워크가 프레임 워크에서 프레임 워크를 사용하지 않으므로 expect 예외 속성을 무시하므로 예외로 인해 테스트가 실패하지 않았으므로 통과합니다.

메서드를 변경하면 더 이상 예외가 throw되지 않는 이유는 더 복잡하지만 기본적으로 yield 키 워드를 사용하는 메서드에 대한 상태 시스템을 만드는 것과 관련이 있습니다. 현재 public 메서드는 yield 키 워드를 직접 사용하지 않으므로 일반 함수처럼 취급되므로 null 확인을 실행하고 메서드가 호출 되 자마자 예외를 throw합니다. yield 키워드를 공용 메서드로 이동하면 게으른 상태 시스템이되므로 IEnumerable 반복을 시작할 때까지 예외 검사를 실행하지 않습니다.

+1

+1. 마지막 문장의 결과는 두 부분으로''yield '하는 public 메소드를 깨는 것이 유용하다는 것입니다. 첫 번째 부분은 유효성 검사를하고 두 번째 호출은'yield'를 수행합니다. 그런 식으로 즉시 유효성 검사가 수행됩니다. –