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

Pho*_*log 13 c# linq unit-testing

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

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

遵循伪代码来演示我的问题:

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

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

    //No actual Assert
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*ert 16

我想知道这是不是一种不好的做法,如果有更好的方法来做到这一点.

是的,是的.

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

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

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