sam*_*rap 19 php phpunit unit-testing mocking
我有一个有趣的场景,我需要定义一个函数,以便为另一个函数进行测试.我想测试的功能看起来像这样:
if (function_exists('foo') && ! function_exists('baz')) {
/**
* Baz function
*
* @param integer $n
* @return integer
*/
function baz($n)
{
return foo() + $n;
}
}
Run Code Online (Sandbox Code Playgroud)
我检查是否存在的foo原因是因为它可能在开发人员的项目中定义,也可能没有定义,并且该函数baz依赖于该函数foo.因此,我只想baz定义它是否可以调用foo.
唯一的问题是到目前为止,无法编写测试.我尝试在PHPUnit配置中创建一个引导脚本,该脚本将定义一个假foo函数,然后需要Composer自动加载器,但我的主脚本仍然认为foo没有定义.foo不是Composer包,我的项目不能要求.显然,Mockery也不适用于此.我的问题是,如果有更多有经验的PHPUnit遇到过这个问题并找到了解决方案.
谢谢!
这应该有效!
use MyProject\baz;
class YourTestCase
{
/** @var callable **/
protected $mockFoo;
/** @var callable **/
protected $fakeFoo;
public function setUp()
{
if (function_exists('foo')) {
$this->mockFoo = function($foosParams) {
foo($foosParams);
// Extra Stuff, as needed to make the test function right.
};
}
$this->fakeFoo = function($foosParams) {
// Completely mock out foo.
};
}
public function testBazWithRealFoo()
{
if (!$this->mockFoo) {
$this->markTestIncomplete('This system does not have the "\Foo" function.');
}
$actualResults = baz($n, $this->mockFoo);
$this->assertEquals('...', $actualResults);
}
public function testBazWithMyFoo()
{
$actualResults = baz($n, $this->fakeFoo);
$this->assertEquals('...', $actualResults);
}
}
Run Code Online (Sandbox Code Playgroud)
然后修改现有代码:
if (function_exists('foo') && ! function_exists('baz')) {
/**
* Baz function
*
* @param integer $n
* @return integer
*/
function baz($n)
{
return foo() + $n;
}
}
namespace MyProject
{
function baz($bazParams, callable $foo = '\foo')
{
return $foo() + $bazParams;
}
}
Run Code Online (Sandbox Code Playgroud)
然后baz($n)您不需要调用 ,而是需要调用:
use MyProject\baz;
baz($bazParams);
Run Code Online (Sandbox Code Playgroud)
这就像函数的依赖注入,哟;-)
| 归档时间: |
|
| 查看次数: |
8763 次 |
| 最近记录: |