gpt4 book ai didi

PHPUnit 模拟函数?

转载 作者:IT王子 更新时间:2023-10-29 00:08:48 26 4
gpt4 key购买 nike

我有一个有趣的场景,我需要定义一个函数以便对另一个函数进行测试。我要测试的功能看起来像这样:

if (function_exists('foo') && ! function_exists('baz')) {
/**
* Baz function
*
* @param integer $n
* @return integer
*/
function baz($n)
{
return foo() + $n;
}
}

我检查 foo 是否存在的原因是因为它可能会或可能不会在开发人员的项目中定义,并且函数 baz 依赖于 foo 。正因为如此,我只想定义 baz 是否可以调用 foo

唯一的问题是到目前为止还无法为其编写测试。我尝试在 PHPUnit 配置中创建一个引导脚本,该脚本将定义一个伪造的 foo 函数,然后需要 Composer 自动加载器,但我的主脚本仍然认为 foo 未定义。 foo 不是 Composer 包,我的项目也不需要它。显然,Mockery 也不会为此工作。我的问题是是否有任何对 PHPUnit 有更多经验的人遇到过这个问题并找到了解决方案。

谢谢!

最佳答案

首先对代码进行轻微重构,使其更易于测试。

function conditionalDefine($baseFunctionName, $defineFunctionName)
{
if(function_exists($baseFunctionName) && ! function_exists($defineFunctionName))
{
eval("function $defineFunctionName(\$n) { return $baseFunctionName() + \$n; }");
}
}

然后就这样调用它:

conditionalDefine('foo', 'bar');

您的 PHPUnit 测试类将包含以下测试:

public function testFunctionIsDefined()
{
$baseName = $this->mockBaseFunction(3);
$expectedName = uniqid('testDefinedFunc');
conditionalDefine($baseName, $expectedName);
$this->assertTrue(function_exists($expectedName));
$this->assertEquals(5, $expectedName(2));
}
public function testFunctionIsNotDefinedBecauseItExists()
{
$baseName = $this->mockBaseFunction(3);
$expectedName = $this->mockBaseFunction($value = 'predefined');
conditionalDefine($base, $expectedName);
// these are optional, you can't override a func in PHP
// so all that is necessary is a call to conditionalDefine and if it doesn't
// error, you're in the clear
$this->assertTrue(function_exists($expectedName));
$this->assertEquals($value, $expectedName());
}
public function testFunctionIsNotDefinedBecauseBaseFunctionDoesNotExists()
{
$baseName = uniqid('testBaseFunc');
$expectedName = uniqid('testDefinedFunc');
conditionalDefine($base, $expectedName);
$this->assertFalse(function_exists($expectedName));
}

protected function mockBaseFunction($returnValue)
{
$name = uniqid('testBaseFunc');
eval("function $name() { return '$value'; }");
return $name;
}

这足以满足您的要求。但是,您可以进一步重构此代码,将函数生成提取到代码生成器中。您可以针对生成器编写单元测试,以确保它创建您期望的函数类型。

关于PHPUnit 模拟函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39341892/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com