我对TDD相当新,而且在单元测试方面没那么老练,因此这个问题。 我有这个用PHP编写的遗留函数
function foo(){
x = bar();
y = baz();
if (x > y)
return 'greater';
return 'lesser';
}
如果x(bar()返回的值)总是大于y(baz()返回的值),我将永远无法测试'lessser'返回语句。
我应该怎样做才能涵盖测试用例并实现100%的代码覆盖率? 为依赖注入挂钩重新定义foo()为foo(x,y)不是遗留代码的选项。
答案 0 :(得分:1)
我假设foo
,bar
和baz
都是全局函数。 (如果它们是类的一部分,那么您希望使用PHPUnit的模拟功能)。
之前我曾在博客中介绍过如何使用pecl扩展来替换内置函数: http://darrendev.blogspot.jp/2012/07/mock-socket-in-php.html
本文展示了一种使用命名空间的非常有趣的替代方法: http://marcelog.github.io/articles/php_mock_global_functions_for_unit_tests_with_phpunit.html
看起来您需要将遗留代码包装在顶部带有名称空间声明的文件中。我不知道这对你是不是一个显示器。
答案 1 :(得分:0)
由于bar()和baz()不接受输入参数,因此它们要么返回一个常量 (你可以立即将foo()重构为{return'greater'};或者它们依赖于某些东西 外部变量。在这种情况下,做一些像
这样的事情 function testFooReturnsGreater() {
setEnvironmentSoBarIsGreaterThanBaz()
assert ("greater".equals(foo())
}
function testFooReturnsLesser() {
setEnvironmentSoBarIsLesserThanBaz()
assert("lesser".equals(foo())
}
既然你说bar()> baz()除非它是圣诞节,否则setEnvironmentxxx()灯具需要改变程序对当前日期的概念(希望你可以模拟的东西,而不是实际的系统时钟)。