在使用TDD时我使用Assert.Fail很多.我通常一次只进行一次测试但是当我得到想要实现的东西的想法时,我会快速写一个空的测试,其中测试方法的名称表明我想要实现的todo-list.为了确保我不忘记我在主体中放置了一个Assert.Fail().
在尝试xUnit.Net时,我发现他们没有实现Assert.Fail.当然你总是可以Assert.IsTrue(false),但这并没有表达我的意图.我得到的印象是Assert.Fail没有故意实施.这被认为是不好的做法吗?如果是这样的话?
@Martin Meredith这不完全是我做的事.我先写一个测试,然后实现代码使它工作.通常我会同时考虑几个测试.或者我想在我正在做其他事情的时候写一个测试.那是我写一个空洞的失败测试来记住的时候.当我开始编写测试时,我整齐地尝试测试.
@Jimmeh这看起来是个好主意.忽略的测试不会失败,但它们仍会显示在单独的列表中.必须尝试一下.
@Matt Howells好主意.在这种情况下,NotImplementedException比assert.Fail()更好地传达意图
@Mitch Wheat这就是我想要的.它似乎被排除在外以防止它以另一种滥用它的方式被滥用.
对于这种情况,我不是调用Assert.Fail,而是执行以下操作(在C#/ NUnit中)
[Test] public void MyClassDoesSomething() { throw new NotImplementedException(); }
它比Assert.Fail更明确.
似乎普遍认为最好使用比Assert.Fail()更明确的断言.大多数框架都必须包含它,因为它们不提供更好的替代方案.例如,NUnit(和其他)提供ExpectedExceptionAttribute来测试某些代码是否抛出特定的异常类.但是,为了测试异常上的属性是否设置为特定值,无法使用它.相反,你必须求助于Assert.Fail:
[Test] public void ThrowsExceptionCorrectly() { const string BAD_INPUT = "bad input"; try { new MyClass().DoSomething(BAD_INPUT); Assert.Fail("No exception was thrown"); } catch (MyCustomException ex) { Assert.AreEqual(BAD_INPUT, ex.InputString); } }
xUnit.Net方法Assert.Throws使得它更加整洁,而不需要Assert.Fail方法.通过不包括Assert.Fail()方法,xUnit.Net鼓励开发人员查找和使用更明确的替代方案,并在必要时支持创建新的断言.
故意被遗漏.这是Brad Wilson的回复,为什么没有Assert.Fail():
实际上,我们并没有忽视这一点.我发现Assert.Fail是一个拐杖,意味着可能缺少一个断言.有时它只是测试结构的方式,有时是因为Assert可以使用另一个断言.
我总是使用Assert.Fail()来处理你已经检测到测试应该通过简单值比较之外的逻辑失败的情况.举个例子:
try { // Some code that should throw ExceptionX Assert.Fail("ExceptionX should be thrown") } catch ( ExceptionX ex ) { // test passed }
因此,框架中缺少Assert.Fail()对我来说似乎是个错误.我建议修补Assert类以包含Fail()方法,然后将修补程序提交给框架开发人员,以及添加它的原因.
至于你在工作区中创建故意失败的测试的做法,提醒自己在提交之前实现它们,这对我来说似乎是一种很好的做法.
我使用MbUnit进行单元测试.他们可以选择忽略测试,在测试套件中显示为橙色(而不是绿色或红色).也许xUnit有类似的东西,并且意味着你甚至不必将任何断言放入方法中,因为它会以一种令人讨厌的不同颜色显示出来而难以错过?
编辑:
在MbUnit中,它采用以下方式:
[Test] [Ignore] public void YourTest() { }