gpt4 book ai didi

class - phpunit 抽象类常量

转载 作者:行者123 更新时间:2023-12-02 05:08:55 25 4
gpt4 key购买 nike

我正在尝试找到一种方法来测试必须存在并且匹配/不匹配值的抽象类常量。例子:

// to be extended by ExternalSDKClild
abstract class ExternalSDK {
const VERSION = '3.1.1.';
}


class foo extends AController {
public function init() {
if ( ExternalSDK::VERSION !== '3.1.1' ) {
throw new Exception('Wrong ExternalSDK version!');
}

$this->setExternalSDKChild(new ExternalSDKChild());
}
}

限制... 我们使用的框架不允许在 init() 方法中进行依赖注入(inject)。 (重构 init() 方法的建议可能是要走的路……)

我运行的单元测试和代码覆盖率涵盖了除异常之外的所有内容。我想不出办法让 ExternalSDK::Version 与原来的不同。

欢迎所有想法

最佳答案

首先,重构对 new 的调用成一个单独的方法。

其次,添加一个获取版本的方法,而不是直接访问常量。 PHP 中的类常量在解析时会编译到文件中,并且无法更改。* 由于它们是静态访问的,因此如果不交换具有相同名称的不同类声明,就无法覆盖它。使用标准 PHP 做到这一点的唯一方法是在一个单独的进程中运行测试,这非常昂贵。

class ExternalSDK {
const VERSION = '3.1.1';

public function getVersion() {
return static::VERSION;
}
}

class foo extends AController {
public function init() {
$sdk = $this->createSDK();
if ( $sdk->getVersion() !== '3.1.1' ) {
throw new Exception('Wrong ExternalSDK version!');
}

$this->setExternalSDKChild($sdk);
}

public function createSDK() {
return new ExternalSDKChild();
}
}

现在进行单元测试。
class NewerSDK extends ExternalSDK {
const VERSION = '3.1.2';
}

/**
* @expectedException Exception
*/
function testInitFailsWhenVersionIsDifferent() {
$sdk = new NewerSDK();
$foo = $this->getMock('foo', array('createSDK'));
$foo->expects($this->once())
->method('createSDK')
->will($this->returnValue($sdk));
$foo->init();
}

* Runkit提供 runkit_constant_redefine() 这可能在这里工作。您需要手动捕获异常,而不是使用 @expectedException因此您可以将常量重置回正确的值。或者您可以在 tearDown() 中进行操作.
function testInitFailsWhenVersionIsDifferent() {
try {
runkit_constant_redefine('ExternalSDK::VERSION', '3.1.0');
$foo = new foo();
$foo->init();
$failed = true;
}
catch (Exception $e) {
$failed = false;
}
runkit_constant_redefine('ExternalSDK::VERSION', '3.1.1');
if ($failed) {
self::fail('Failed to detect incorrect SDK version.');
}
}

关于class - phpunit 抽象类常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7835524/

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