将其添加到引导文件中为什么不起作用?
是因为有时系统会正确创建函数baz
(A),有时需要模拟它(B),还是始终需要模拟它(C)?
- 情况A:为什么代码会偶尔在运行时创建一个重要的函数?
- 情况B:一个函数只能被注册一次,永远不能被注销或覆盖。因此,您要么使用模拟,要么不使用。不允许混合使用。
- 情况C:如果您始终需要模拟它,并将其添加到引导文件中,则会定义它。关于您尝试过的内容,要么您的phpunit引导文件未正确加载,要么您拼写了函数名称。
我相信您已经正确配置了phpunit引导,但为了保险起见,它是否与以下内容类似:
/tests/phpunit.xml
:
<phpunit
bootstrap="phpunit.bootstrap.php"
</phpunit>
/tests/phpunit.bootstrap.php
:
<?php
require(__DIR__ . "/../bootstrap.php");
if (function_exists('foo') && ! function_exists('baz')) {
function baz($n)
{
return foo() + $n;
}
}
不要在测试中动态创建函数baz
,例如在setUp
函数中。
PHPUnit中的测试套件使用相同的引导程序。因此,如果您需要测试定义了函数baz
和未定义函数baz
(并且您需要模拟它),则需要将tests
文件夹拆分为两个不同的文件夹,每个文件夹都有自己的phpunit.xml
和phpunit.bootstrap.php
文件。例如:/tests/with-baz
和/tests/mock-baz
。从这两个文件夹中分别运行测试。只需在每个子文件夹中创建到phpunit
的符号链接(例如,如果composer在根目录中,则从/test/with-baz
创建ln -s ../../vendor/bin/phpunit
),以确保在两种情况下运行相同版本的phpunit。
当然,最终的解决方案是找出baz
函数的定义位置,并手动包含罪犯脚本文件(如果可能的话),以确保应用正确的逻辑。
替代方案
使用phpunit的@runInSeparateProcess
注释,并根据需要定义函数。
<?php
class SomeTest extends \PHPUnit_Framework_TestCase
{
public function testOne()
{
if (false === function_exists('baz')) {
function baz() {
return 42;
}
}
$this->assertSame(42, baz());
}
public function testTwo()
{
$this->assertFalse(function_exists('baz'));
}
}
namespace
,我可以使用php-mock-phpunit来回答你。否则,你可以尝试使用runkit。 - Markus Malkuschfoo
的情况下才定义baz
,但仍然没有定义baz
。今晚稍后会跟进。 - samrapbaz
而不是bar
? - Infiltrator