2016-03-22 2 views
3

編集:同様の質問hereがありますが、解決策のみが示唆されています。この質問は依然として重複している可能性があります。c#Xunit、Assert.Throwsは予期しない例外が発生した場合に失敗します

EDIT 2:それは、この問題が判明、それは以前に起こっていなかったものの、デバッグ時のだけ出来事です。 (TCheck)nullnull as TCheckに置き換えた後、テストは成功しましたが、デバッグ時に例外がスローされます。

ORIGINAL POST: 私はこの

internal void EqualityAssert<TCheck, TEquatable>(TEquatable item, ...) 
    where TCheck : class, IEquatable<TEquatable>, TEquatable 
{ 

    // Various equality assertions that are passing 
    // ... 

    // A == null  
    Assert.Throws<NullReferenceException>(
    () => ((IEquatable<TEquatable>)item).Equals((TCheck)null));    
} 

この方法は、種々の単体テストによって呼び出され、これらのテストの各々は、「未処理とNullReferenceExceptionため失敗しているように見えるユニットテストにおける方法を有しますそれが期待されるところに正確に遭遇した。

Assert.Throwsは私にとって以前は適切に機能していましたが、何が変わったのか分かりませんでした。

+0

が原因 '(TCheck)null'なのでのものであってもよいです。これを 'TCheck'として' null 'に変更してみてください。私はちょうどこれを行ったし、それはそうは思わないが、あなたのシナリオで何が起こるかを見てうれしい。 –

+0

テストのデバッグを試しましたか? – rclocher3

+0

@StephenRossそれは問題を解決しませんでしたが、Equals実装では例外が発生しました。 –

答えて

0

例外をスローしますが、それを処理する必要があります。以下のコードを確認してください。私の例に従ってコードを変更することができます。

var message = FakeRequestBuilder.CreateSettlementFileMessage(); 

var warning = Assert.Throws<ExF.Core.Exception.IntegrationValidationException>(
       () => createSettlementFileHandler.Handle(message)); 

Assert.Equal(warning.ErrorCode, -1); 
4

このパターン使用することをお勧め:

[Fact] 
public void Divide_TwoNumbers_ExpectException() 
{ 
    var sut = new Calculator(); 
    var exception = Record.Exception(() => sut.Divide(10, 0)); 
    Assert.IsType(typeof(DivideByZeroException), exception); 
} 
+2

なぜそれは良いですか? – ediblecode

+1

非同期メソッドの場合、 'Record.Exception(()=> GetSomeAsync()。GetAwaiter()。GetResult());'、 –

+2

この回答は、 https://www.richard-banks.org/2015/07/stop-using-assertthrows-in-your-bdd.htmlのコピー&ペースト。ソースとしてリンクする必要があります。 –

関連する問題