使用Single作为Assert是一种不好的做法吗?

时间:2016-10-10 17:43:14

标签: c# linq unit-testing

我正在测试一个操纵集合的方法。给定一组参数,它应该只包含一个匹配条件的元素。 编辑:该集合可能还有其他几个与条件不匹配的元素。

我正在使用Single来测试该行为,这样可以正常工作,因为如果根本没有匹配或多个匹配则抛出异常将导致测试失败。但是没有实际的断言,它以某种方式违反了 a rrange, a ct, a ssert。所以我想知道这是不是一种不好的做法,如果有更好的方法可以做到这一点。

遵循伪代码来证明我的问题:

[TestMethod]
public void TestMethod()
{
    List list = MethodToTest(param1, param2);

    list.Single(s => s.Matches(condition));

    //No actual Assert
}

1 个答案:

答案 0 :(得分:16)

  

我想知道这是不是很糟糕的做法,如果有更好的方法可以做到这一点。

是的,是的。

  

如果根本没有匹配或多个匹配,则抛出异常将导致测试失败。

不要通过抛出异常来使测试失败。 测试失败导致测试失败。您的测试框架具有一种机制,用于断言测试所测试的条件。您购买了此测试框架,现在您正在抵制使用其功能。使用设计使用的测试框架,或者,如果您不喜欢它,请放弃它并选择您更喜欢的框架。但不要围绕其机制进行最终运行。

意外的异常不一定是测试失败;他们可能是越野车测试。你需要能够区分它们。你告诉我的方法是:如果异常来自于测试中的代码,它就是代码中的一个错误。如果它源自测试代码,那么它就是测试中的一个错误。现在,您可以通过测试代码抛出来检测被测代码中的错误。而现在很难分辨出错误的位置。不要让你的未来自我思考;不要编写故意避免测试平台惯例的令人惊讶的代码。