在一次测试中返回多个断言消息

时间:2015-03-13 16:57:53

标签: c# unit-testing nunit mstest assert

我正在对我的代码运行一些测试。我的主要测试方法用于验证某些数据,但在该检查中,它有很多可能在任何一点失败。

现在,我在我的方法中设置了多个Assert.Fail语句,当测试失败时,我输入的消息将按预期显示。但是,如果我的方法多次失败,它只显示第一个错误。当我解决这个问题时,我才发现第二个错误。

我的测试都不依赖于我正在运行的任何其他测试。理想情况下,我希望能够让我的失败消息在一次传递中显示每条失败的消息。这样的事情有可能吗?

根据评论,以下是我在方法中设置几个测试的方法:

  private bool ValidateTestOne(EntityModel.MultiIndexEntities context)
  {
     if (context.SearchDisplayViews.Count() != expectedSdvCount)
        {
              Assert.Fail(" Search Display View count was different from what was expected");

        }
     if (sdv.VirtualID != expectedSdVirtualId)
        {
             Assert.Fail(" Search Display View virtual id was different from what was expected");

        }
     if (sdv.EntityType != expectedSdvEntityType)
        {
           Assert.Fail(" Search Display View entity type was different from what was expected");

        }
    return true;
  }

3 个答案:

答案 0 :(得分:1)

为什么没有包含所有失败消息的字符串/ stringbuilder,检查代码末尾的长度,并将其传递给Assert.Fail?只是一个建议:)

答案 1 :(得分:0)

NUnit测试运行器(假设您使用的是什么)旨在一旦出现任何故障就会中断测试方法。

因此,如果您希望每个失败,您需要将测试分解为更小的单个断言。一般来说,您只想在每次测试中测试一件事无论如何

在旁注中,使用Assert.Fail之类的语义在语义上并不正确。考虑使用其他内置方法(如Assert.Equals),仅在其他方法不足时使用Assert.Fail

答案 2 :(得分:0)

  

我的测试都不依赖于我正在运行的任何其他测试。理想的情况下   我想要的是能够显示我的失败信息   一遍中每条失败的消息。这样的事情有可能吗?

只有将测试分成几个较小的测试才有可能。

如果您害怕在测试很复杂时通常存在代码重复,则可以使用安装方法。它们通常由属性标记:

以下代码显示了如何重写您的测试:

public class HowToUseAsserts
{
    int expectedSdvCount = 0;
    int expectedSdVirtualId = 0;
    string expectedSdvEntityType = "";

    EntityModelMultiIndexEntities context;

    public HowToUseAsserts()
    {
        context = new EntityModelMultiIndexEntities();
    }

    [Fact]
    public void Search_display_view_count_should_be_the_same_as_expected()
    {
        context.SearchDisplayViews.Should().HaveCount(expectedSdvCount);
    }

    [Fact]
    public void Search_display_view_virtual_id_should_be_the_same_as_expected()
    {
        context.VirtualID.Should().Be(expectedSdVirtualId);
    }

    [Fact]
    public void Search_display_view_entity_type_should_be_the_same_as_expected()
    {
        context.EntityType.Should().Be(expectedSdvEntityType);
    }
}

因此,您的测试名称可以提供与您编写的消息相同的信息:

enter image description here

  

现在,我在我的内部设置了多个Assert.Fail语句   方法,当测试失败时,我输入的消息显示为   预期。但是,如果我的方法多次失败,它只显示   第一个错误。当我解决这个问题时,我才会发现它   第二个错误。

这种行为是正确的,许多测试框架都遵循它。

我建议您停止使用Assert.Fail(),因为它会强制您为每次失败编写特定的消息。常见断言提供了足够好的消息,因此您可以使用以下行替换代码:

    // Act
    var context = new EntityModelMultiIndexEntities();

    // Assert
    Assert.Equal(expectedSdvCount, context.SearchDisplayViews.Count());
    Assert.Equal(expectedSdVirtualId, context.VirtualID);
    Assert.Equal(expectedSdvEntityType, context.EntityType);

但我建议开始使用像Fluent Assertions这样的应用框架,这样可以让您的代码可读并提供更好的输出。

    // Act
    var context = new EntityModelMultiIndexEntities();

    // Assert
    context.SearchDisplayViews.Should().HaveCount(expectedSdvCount);
    context.VirtualID.Should().Be(expectedSdVirtualId);
    context.EntityType.Should().Be(expectedSdvEntityType);