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

如果您希望这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());
}

但是,现在我看到您正在使用 VSUnit,您应该按照[ExpectedException(typeof(...))] 其他答案中的说明使用。

一般来说,您应该对成功、失败和异常条件进行单独的测试。

于 2012-04-23T19:04:12.157 回答
2

我总是尽我所能避免将 try-catch 子句放在我的单元测试中。而是尝试使用 ExpectedException 属性(NUnit 和 MSTest 的属性相同)并将类型设置为您期望的异常,即

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

我使用的另一种方法是使用 AssertExpectedException 方法创建一个静态类,因为有时一个方法可能会由于不同的原因引发相同类型的异常,并且确定是否返回准确消息的唯一方法是使用自定义代码,因为该属性不断言抛出的异常返回的消息。

希望这可以帮助。

问候。

于 2012-04-23T19:07:08.303 回答
1

我通常这样做的方式是用ExpectedExceptionhttp://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 回答