2017-01-18 13 views
2

MSTestが通過している間に、XUnitがユニットテストで例外をキャッチできない理由を理解していないプロジェクトがあります。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からの戻りオブジェクトを割り当て、それを反復処理しようとすることで渡すためにそれらの両方を得ることができますが、1つのフレームワークが通過していると他が失敗する理由は説明していない

答えて

3

"xUnit.netはAssert.Throwsを優先してExpectedException属性を削除しました。" https://xunit.github.io/docs/comparisons.htmlから。

結果のフリップの理由は、例外はもはやそれほどスローされることはありません:

MSTestを:それは例外を取得していないので、それが属性を使用していますので、失敗しているため、例外を期待し

XUnit:フレームワークはそれを使用しないため、exception例外属性は無視されるため、例外が発生してもテストが失敗しないため、渡します。

メソッドを変更すると例外がスローされなくなる理由はより複雑ですが、基本的にyieldキーワードを使用するメソッドのステートマシンを作成することと関係しています。現在のところ、パブリックメソッドはyieldキーワードを直接使用しないため、通常の関数と同様に扱われるため、ヌルチェックが実行され、メソッドが呼び出されるとすぐに例外がスローされます。 yieldキーワードをパブリックメソッドに移動すると、それが遅延状態マシンになるので、IEnumerableの反復処理を開始するまで、nullチェックを実行して例外をスローしません。

+1

+1。最後のセンテンスの結果は、パブリックメソッドを2つの部分に分けることが有効であることです。最初の部分は検証を行い、2番目の呼び出しは 'yield 'を行います。そうすれば、検証は即座に行われます。 –

関連する問題