所以,我正试图了解如何编写可测试的代码,并正在使用.srt(字幕)播放器的项目。
我有一个类Player,它有属性框架和sourcePath。
我有一个方法loadFrames(),我通常会写它只是打开在sourcePath找到的文件,解析它,并相应地填充框架。
然而 - 我希望能够测试这个。我想避免不得不调用文件系统 - 我希望能够定义sourcePath中'file'的内容在我的测试中。
我的方法是让方法loadFrames采用IFileLoader类型的参数,该参数有一个方法String [] GetSourceText(String source);
生产中使用的真实FileLoader将解析在源文件中找到的文件。在我的测试中,我使用了一个FakeFileLoader,它返回我设置为它的contents属性的值。
所以 - 我的问题是 - 我是以一种好的方式做到这一点。它不像我通常编写代码的方式。编写可测试代码肯定似乎与我习惯的不同,虽然这满足了我当前要求能够指定源代码的内容 - 我想知道我的方式是否合乎逻辑。是否有更好,更明智的方法来实现相同的结果?
非常感谢所有帮助和见解!
P.S我没有使用任何模拟框架等,只是简单的代码。我实际上是用C#编写的,我从来没有这样做(通常是Java),但我当然认为这是一个通用的测试问题,并不是特定于任何一种语言。
答案 0 :(得分:0)
到目前为止,这么好。如果您的测试保持简洁和有用,则无需选择模拟框架。
除此之外,“正确”的测试驱动编程IMO正在以这样的方式工作,即您从有价值的期望开始,并以实际的,完全可测试的代码结束。或者简单地说,从外部工作。相反,“错误”的开始是不明确的期望,并以许多不必要的,脆弱的和错误的代码结束。
答案 1 :(得分:0)
如果方法loadFrames()
最初没有参数,那么最好避免添加一个参数。而是创建一个工厂方法,该方法返回类型为IFileLoader
的对象,并使用该工厂方法而不是参数。
然后,为了测试,创建一个Player
的子类,比如说TestPlayer
,它返回测试IFileLoader
。
我还建议使用模拟框架。
听起来您正在为遗留代码添加测试。如果是这样,我建议使用“有效使用遗留代码”一书,该书讨论了如何在现有代码中添加测试。