(单位)测试驱动开发

时间:2013-08-21 14:44:33

标签: unit-testing phpunit

我对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)不是遗留代码的选项。

2 个答案:

答案 0 :(得分:1)

我假设foobarbaz都是全局函数。 (如果它们是类的一部分,那么您希望使用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()灯具需要改变程序对当前日期的概念(希望你可以模拟的东西,而不是实际的系统时钟)。