我是TDD的新手,在单元测试方面经验不是很丰富,因此出现了这个问题。我有一个用PHP编写的遗留函数
function foo(){
x = bar();
y = baz();
if (x > y)
return 'greater';
return 'lesser';
}
如果x(bar()返回的值)总是大于y(baz()返回的值),我将永远无法测试'lesser‘返回语句。
我应该怎么做才能覆盖这两个测试用例,并达到100%的代码覆盖率?对于遗留代码,将foo()重新定义为foo(x,y)以用于依赖注入钩子是不可取的。
发布于 2013-08-22 07:32:38
我假设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
看起来您需要将遗留代码包装在一个文件中,文件的顶部有一个名称空间声明。我不知道这对你来说是不是很精彩。
发布于 2013-08-21 22:55:49
由于bar()和baz()不接受输入参数,因此它们要么返回一个常量(您可以立即将foo()重构为{ return 'greater‘};要么依赖于一些外部变量。在这种情况下,可以这样做
function testFooReturnsGreater() {
setEnvironmentSoBarIsGreaterThanBaz()
assert ("greater".equals(foo())
}
function testFooReturnsLesser() {
setEnvironmentSoBarIsLesserThanBaz()
assert("lesser".equals(foo())
}
由于除非是圣诞节,否则您需要使用bar() > baz(),所以setEnvironmentxxx() fixture需要更改程序对当前日期的概念(希望是您可以模拟的日期,而不是实际的系统时钟)。
https://stackoverflow.com/questions/18360580
复制相似问题