gpt4 book ai didi

phpunit - 模拟外部静态方法

转载 作者:行者123 更新时间:2023-12-03 23:14:38 25 4
gpt4 key购买 nike

我正在拼命地尝试对商店系统的模块进行单元测试。该商店系统使用静态方法,我必须在要测试的函数中调用这些方法。

public function toTest() {
$value = \Context::getData();
return $value;
}

现在如何在模拟这个静态调用时对该函数进行单元测试?我尝试使用 AspectMock 但这不起作用,因为它显然需要访问原始的\Context 类,因为它是一个外部系统,所以它不可用。我还尝试使用 class_alias 创建自己的 Context 类,但这也不起作用,因为我需要不同的 Context 输出,具体取决于我正在测试的函数。并且为不同的测试多次设置 class_alias 不起作用,因为不能多次声明同一个类并且 @runTestsInSeparateProcesses 没有预期的效果。

编辑:没有一个副本为我的情况提供了可行的解决方案,所以我认为这不是一个副本。由于无法访问 shopsystem 代码,尤其是难以维护这样的代码,PHP 无法轻松对其进行单元测试。此外,我找到的解决方案应该可以帮助其他具有类似设置的人。

最佳答案

我可以用 Mockery 库解决我的问题。我尝试了一些,但没有任何效果。有了 Mockery,现在一切似乎都成为可能。这个链接真的很有帮助:https://robertbasic.com/blog/mocking-hard-dependencies-with-mockery/

您可以轻松地模拟对不属于您的类的静态调用:

public function methodToTest() {
return \Context::getData();
}

public function testMethodToTest() {
m::mock('alias:\Context')
->shouldReceive('getData')
->andReturn('foo');
}

甚至是您无权访问的类的实例化:
public function methodToTest() {
$obj = new \Category(5);
return $obj->id;
}

public function testMethodToTest() {
m::mock('overload:\Category')
->shouldReceive('__construct')
->with(5)
->andSet('id', 5);
}

但是你必须记住,你需要在类的开头有两个 phpunit 注释:
* @runTestsInSeparateProcesses
* @preserveGlobalState disabled

关于phpunit - 模拟外部静态方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53481778/

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