0

メールを送信する簡単な方法があります。

public void notifyEmail(string messageSubject, string messageBody)
{
   MailMessage message = new MailMessage(from, to);

   message.Subject = messageSubject;
   message.Body = messageBody;

   SmtpClient client = new SmtpClient(smtp_client);
   client.Send(message);

   message.Dispose();//release everything related
}

そして単体テスト(私は学んでいます):

[TestMethod()]
    public void notifyEmailTest()
    {
        eMail target = new eMail("TEST Subject","TEST Body"); // TODO: Initialize to an appropriate value

        bool testSent = true;
        try
        {
            target.notifyEmail();
        }
        catch (Exception)
        {
            testSent = false;
        }

        Assert.IsTrue(testSent);            
    }

smtp_client 変数の値を意図的に無効なものに設定しました。

プロジェクトでコードを実行すると、エラーが発生します。

テスト メソッドを実行すると、合格となります。エラーがテストに失敗するように、テストまたはメソッドを別の方法で構成する必要がありますか?

4

4 に答える 4

2

私は常に、単体テストにtry-catch句を配置しないようにできる限りのことをしています。代わりに、ExpectedException属性(属性はNUnitとMSTestで同じ)を使用して、タイプを予期している例外に設定してみてください。

[TestMethod]
[ExpectedException(typeof(NetworkException))]
public void ShouldThrowNetworkExceptionIfSmtpServerIsInvalid)
{
     //... test code here.
}

私が使用した別のアプローチは、AssertExpectedExceptionメソッドを使用して静的クラスを作成することです。これは、メソッドがさまざまな理由で同じタイプの例外をスローする場合があり、正確なメッセージが返されるかどうかを確認する唯一の方法は、カスタムコードを使用することです。属性は、スローされた例外が返すメッセージをアサートしません。

お役に立てれば。

よろしく。

于 2012-04-23T19:07:08.303 に答える
2

例外がスローされると予想される場合はtarget.notifyEmail()、それをテストする必要があります。NUnit を使用していた場合はAssert.Throws<T>、次のように使用できます。

[Test]
public void notifyEmailTestFails()
{
    // TODO: Initialize to an appropriate value
    eMail target = new eMail("TEST Subject","TEST Body"); 
    Assert.Throws<InvalidOperationException>(target.notifyEmail());
}

[ExpectedException(typeof(...))] ただし、他の回答で述べたように、使用する必要がある VSUnit を使用していることがわかります。

一般に、成功、失敗、および例外条件に対して個別のテストを行う必要があります。

于 2012-04-23T19:04:12.157 に答える
1

私が通常これを行う方法は、テストを装飾することですExpectedException( http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.testtools.unittesting.expectedexceptionattribute(v=vs.80).aspx )

. しかし、「例外」よりもはるかに一般的ではないものをキャッチしたいと考えています。

予想される例外を使用したくない場合は、代わりに次のようにします。

 bool testSent = true;

        try
        {
            target.notifyEmail();
        }
        catch (Exception)
        {
            testSent = false;
        }

        Assert.IsTrue(testSent);

少し冗長にすることができます:

try{
 target.notifyEmail();
 Assert.Fail("Expected an exception here");
}
catch (SmtpException){

}
于 2012-04-23T19:04:45.243 に答える
0

FluenAssertions を試すことを強くお勧めします。

http://fluentassertions.codeplex.com/

彼らはシンプルで素晴らしくエレガントです

ExpectedExceptionそして、彼らはあなたに例外メッセージをチェックさせます(属性ではそれを行うことはできません)

例:

using FluentAssertions;

[TestMethod]
public void notifyEmailTest()
{
    eMail target = new eMail("TEST Subject","TEST Body"); // TODO: Initialize to an appropriate value

target.Invoking(x => x.notifyEmail())
    .ShouldThrow<YourExcpectedException>()
            .WithMessage("Your expected message", FluentAssertions.Assertions.ComparisonMode.Substring);
}
于 2012-04-23T20:33:48.970 に答える