可测试的代码 - 我做得对吗?

时间:2012-02-01 01:45:40

标签: unit-testing

所以,我正试图了解如何编写可测试的代码,并正在使用.srt(字幕)播放器的项目。

我有一个类Player,它有属性框架和sourcePath。

我有一个方法loadFrames(),我通常会写它只是打开在sourcePath找到的文件,解析它,并相应地填充框架。

然而 - 我希望能够测试这个。我想避免不得不调用文件系统 - 我希望能够定义sourcePath中'file'的内容在我的测试中。

我的方法是让方法loadFrames采用IFileLoader类型的参数,该参数有一个方法String [] GetSourceText(String source);

生产中使用的真实FileLoader将解析在源文件中找到的文件。在我的测试中,我使用了一个FakeFileLoader,它返回我设置为它的contents属性的值。

所以 - 我的问题是 - 我是以一种好的方式做到这一点。它不像我通常编写代码的方式。编写可测试代码肯定似乎与我习惯的不同,虽然这满足了我当前要求能够指定源代码的内容 - 我想知道我的方式是否合乎逻辑。是否有更好,更明智的方法来实现相同的结果?

非常感谢所有帮助和见解!

P.S我没有使用任何模拟框架等,只是简单的代码。我实际上是用C#编写的,我从来没有这样做(通常是Java),但我当然认为这是一个通用的测试问题,并不是特定于任何一种语言。

2 个答案:

答案 0 :(得分:0)

到目前为止,这么好。如果您的测试保持简洁和有用,则无需选择模拟框架。

除此之外,“正确”的测试驱动编程IMO正在以这样的方式工作,即您从有价值的期望开始,并以实际的,完全可测试的代码结束。或者简单地说,从外部工作。相反,“错误”的开始是不明确的期望,并以许多不必要的,脆弱的和错误的代码结束。

答案 1 :(得分:0)

如果方法loadFrames()最初没有参数,那么最好避免添加一个参数。而是创建一个工厂方法,该方法返回类型为IFileLoader的对象,并使用该工厂方法而不是参数。

然后,为了测试,创建一个Player的子类,比如说TestPlayer,它返回测试IFileLoader

我还建议使用模拟框架。

听起来您正在为遗留代码添加测试。如果是这样,我建议使用“有效使用遗留代码”一书,该书讨论了如何在现有代码中添加测试。