测试框架每行有多个Assert

时间:2016-02-08 13:44:35

标签: c# unit-testing

是否有一个c#testing-framework允许在一个语句中将多个断言集中在一起,如下所示:

Assert.AreEqual("valueA", object.A).AreEqual( "valueB", object.B)...

而不是

Assert.AreEqual("valueA", object.A);
Assert.AreEqual( "valueB", object.B);
...

这会使测试代码更短,对吧?

谢谢!

2 个答案:

答案 0 :(得分:1)

我不认为您会找到这样的框架,因为大多数资源都会告诉您,在您编写的每个测试中保留一个<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script> <aside> <button type="button" id="N">16-50mm</button> <button type="button" id="J">25-75mm</button> <button type="button" id="M">30-50mm</button> <button type="button" id="G">50-120mm</button> <button type="button" id="K">50-100mm</button> <button type="button" id="A">75-200mm</button> <button type="button" id="C">75-200mm</button> <button type="button" id="F">75-150mm</button> </aside> <section class="N hide"> <figure> <a href="A1.html"><img src="Images/000-001.jpg" alt="Image1 A1"></a> <br> <figcaption>Name</figcaption> </figure> </section> <section class="J hide"> <figure> <a href="A1.html"><img src="Images/000-001.jpg" alt="Image2 A1"></a> <br> <figcaption>Name2</figcaption> </figure> </section>是一种很好的做法。

将多个断言链接在一起将使得更难理解哪些失败,失败(并且它们肯定会在某些时候失败)以及调试时更难。

如果您仍然决定这样做,那么将您正在使用的测试框架包装起来可以非常简单,并且可能看起来像这样:

assert

(这不是一个有效的例子,但只是关于如何实现这个的想法)。

无论哪种方式,&#39;更短的代码&#39;永远不应该是你的最终目标。目标应该具有可读代码。使用IDE的自动完成功能键入较少的内容(即:Visual Studio&#39;智能感知)。

...如果您仍然非常坚定地拥有最短的代码(我强烈建议不要这样做),那么就这样做:

public class Assertion {
    public Assertion AssertEquals(object actual, object expected) {
        // TODO: call your framework Assert.AreEqual() here
        Assert.AreEqual(a, b);
        return this;
    }
}

// and now you can do something like this :
new Assertion()
    .AssertEquals("objectA", object.A)
    .AssertEquals("objectB", object.B);

然后你的测试将如下所示:

public static void a(object a, object b) {
    Assert.AreEqual(a, b);
}  
像我说的那样,这是不可读的......:/

答案 1 :(得分:1)

FluentAssertions可以让您执行以下操作:

string actual = "ABCDEFGHI";
actual.Should().StartWith("AB").And.EndWith("HI").And.Contain("EF").And.HaveLength(9);

More examples on the documentation

也就是说,多个断言充其量只是麻烦,将它们链接在一起会使得查看哪个断言失败更加困难。请参阅有关XUnit模式的Assertion Roulette