2015-03-13 251 views
0

我现在正在对我的代码运行一些测试。我的主要测试方法是用来验证一些数据,但在这个检查中,有很多潜在的失败点。在一次测试中返回多个断言消息

现在,我已经设置了多个我的方法中Assert.Fail语句,而在试验不合格,符合市场预期,显示I型的消息。但是,如果我的方法多次失败,它只会显示第一个错误。当我解决这个问题时,才发现第二个错误。

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

按照该意见,这里有我如何设立了几个我的测试的方法:

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

没有任何相关的代码,除了“这就是它应该如何工作”以及“将测试分解成更小的测试”之外,没有什么可说的了。 – CodeCaster 2015-03-13 17:00:06

+1

...正如@CodeCaster所说,很难评论。代替代码,您可能需要阅读:[“*是否可以在单个单元测试中使用多个声明?”](http://programmers.stackexchange.com/q/7823/163789)。 – 2015-03-13 17:02:21

+0

更新了代码示例 – Sean 2015-03-13 17:06:26

回答

1

为什么不能有一个字符串/ StringBuilder的保存所有的失效信息,检查其在你的代码的最后,并将其传递到Assert.Fail?只是一个建议:)

0

NUnit的测试运行(您所使用的假设多数民众赞成)旨在尽快出现任何故障,打出来的测试方法。

所以如果你想失败显示,你需要将你的测试分解成更小,单一断言。一般来说,你只想测试一件东西反正

在一个侧面说明,使用Assert.Fail好像不是很语义正确。考虑使用其他内置方法(如Assert.Equals),并且只有在其他方法不足时才使用Assert.Fail

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语句,当测试失败时,混乱年龄I类型显示为预期的 。但是,如果我的方法多次失败,它只会显示 的第一个错误。当我解决这个问题时,它才发现 第二个错误。

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

我想推荐停止使用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);