首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(单元)测试驱动开发

(单元)测试驱动开发
EN

Stack Overflow用户
提问于 2013-08-21 22:44:33
回答 2查看 114关注 0票数 3

我是TDD的新手,在单元测试方面经验不是很丰富,因此出现了这个问题。我有一个用PHP编写的遗留函数

代码语言:javascript
运行
复制
function foo(){
   x = bar();
   y = baz();
   if (x > y)
     return 'greater';
   return 'lesser';
}

如果x(bar()返回的值)总是大于y(baz()返回的值),我将永远无法测试'lesser‘返回语句。

我应该怎么做才能覆盖这两个测试用例,并达到100%的代码覆盖率?对于遗留代码,将foo()重新定义为foo(x,y)以用于依赖注入钩子是不可取的。

EN

回答 2

Stack Overflow用户

发布于 2013-08-22 07:32:38

我假设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
EN

Stack Overflow用户

发布于 2013-08-21 22:55:49

由于bar()和baz()不接受输入参数,因此它们要么返回一个常量(您可以立即将foo()重构为{ return 'greater‘};要么依赖于一些外部变量。在这种情况下,可以这样做

代码语言:javascript
运行
复制
 function testFooReturnsGreater() {
     setEnvironmentSoBarIsGreaterThanBaz()
     assert ("greater".equals(foo())
 }

 function testFooReturnsLesser() {
    setEnvironmentSoBarIsLesserThanBaz()
    assert("lesser".equals(foo())
}

由于除非是圣诞节,否则您需要使用bar() > baz(),所以setEnvironmentxxx() fixture需要更改程序对当前日期的概念(希望是您可以模拟的日期,而不是实际的系统时钟)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18360580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档