这个单元测试中有太多断言吗?

Arl*_*len 7 unit-testing assert

在这个单元测试中是否有太多断言?

[Fact]
public void Send_sends_an_email_message() {
    using (var server = new MockSmtpServer()) {
        server.Start();
        using (var client = new EmailClient("localhost")) {
            string from = "john.doe@example.com";
            IEnumerable<string> to = new[] { "jane.doe@example.com" };
            string subject = "Test";
            string body = "Test.";
            client.Send(from, to, subject, body);
            var session = server.Sessions.FirstOrDefault();
            Assert.NotNull(session);
            var message = session.Messages.FirstOrDefault();
            Assert.NotNull(message);
            Assert.NotNull(message.From);
            Assert.Equal(message.From.Address, "john.doe@example.com");
            Assert.NotNull(message.To);
            var recipient = message.To.FirstOrDefault();
            Assert.NotNull(recipient);
            Assert.Equal(recipient.Address, "jane.doe@example.com");
            Assert.Equal(message.Subject, "Test");
            Assert.Equal(message.Body, "Test.");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我不认为此代码需要任何解释,但如果确实如此,请告诉我.

Gor*_*don 6

我试着保持我的UnitTests相当小,一次测试一件事.所以我可能会将不同的部分测试到单独的测试中,例如

  • sendWillSendAnEmail,
  • fromContainsSenderAddress,
  • toContainsRecipientAddress,
  • mailBodyContainsMailMessage,
  • mailContainsSubject


Pau*_*ips 6

我觉得它太大了.

当你有一堆较小的测试时,你可以获得"缺陷本地化" - 只需运行所有测试,你就可以确切地看到问题所在.由于您拥有尽可能多的断言(并且没有断言消息),您可能必须启动调试器才能找到答案.请记住,您可能最终会有数百个(如果不是数千个)测试,如果其中一组测试失败,您不需要调试每个测试以查看原因.

此外,任何断言在测试早期失败意味着后面的断言不会运行.当它们被分成单独的测试时,每个断言都会被检查.这是一种权衡; 很多这些断言可能是相关的并且会同时失败,所以你将有五个红色测试而不是一个.但我的前提是更多的信息更好,所以我宁愿进行这五个测试,并且知道所有五个断言都失败了.