假设:VS2010,.NET 4,C#,NUnit,Moq
我是TDD的新人,在通过项目工作时遇到这个问题.
给定类:
public abstract class MyFileType { public MyFileType(String fullPathToFile) { if (!File.Exists(fullPathToFile)) { throw new FileNotFoundException(); } // method continues } }
我试图使用以下方法进行测试:
[Test] [ExpectedException(typeof(System.IO.FileNotFoundException))] public void MyFileType_CreationWithNonexistingPath_ExceptionThrown() { String nonexistingPath = "C:\\does\\not\\exist\\file.ext"; var mock = new Mock<MyFileType>(nonexistingPath); }
测试失败,NUnit报告的异常从未被抛出.
我确实发现一个section in the NUnit docs谈论断言与例外,但这些例子似乎并不像我想要做的.我仍然开始使用NUnit和Moq,所以我可能会这样做错了.
更新:
为了帮助澄清为什么这个例子使用抽象类,它是一个系列文件类型的基类,只有数据的加载和处理在子类型之间不同.我最初的想法是将open / setup的逻辑放在一个基类中,因为它对于所有类型都是相同的.
解决方法
如果你必须让这个类是抽象的,那么我们应该只是实现它,因为它是(简单):
MSDN: an abstract class
MSDN: an abstract class
所以,同意(与alexanderb),这里可能不需要一个模拟,还有Stecy在.Throws NUnit Assert扩展,你可以在测试中创建一个类,调用基类如下:
using System; using System.IO; namespace fileFotFoundException { public abstract class MyFile { protected MyFile(String fullPathToFile) { if (!File.Exists(fullPathToFile)) throw new FileNotFoundException(); } } } namespace fileFotFoundExceptionTests { using fileFotFoundException; using NUnit.Framework; public class SubClass : MyFile { public SubClass(String fullPathToFile) : base(fullPathToFile) { // If we have to have it as an abstract class... } } [TestFixture] public class MyFileTests { [Test] public void MyFile_CreationWithNonexistingPath_ExceptionThrown() { const string nonExistingPath = "C:\\does\\not\\exist\\file.ext"; Assert.Throws<FileNotFoundException>(() => new SubClass(nonExistingPath)); } } }