unit-testing - 用 Mockery 和 PHPUnit 模拟一个类的常量和方法
问题描述
Mockery 的新手......我正在测试一个调用另一个类(Foo->getData)的方法的类(在我过于简单的平淡示例中为 Buzz),并且我有一个模拟这个方法的模拟效果很好。现在我添加了对类常量(Foo::FIZZ)的检查,并且由于未定义常量而导致我的测试中断。
我试图通过映射常量来添加常量,如Mockery Docs here中所示,但它仍然说常量 FOO\Bar::FIZZ 未定义。我还没有找到任何其他方法来为我的 Mockery 模拟设置常量。任何帮助,将不胜感激!
约束:由于模拟类内部存在一些硬依赖,我必须使用重载 Mockery 。
namespace Foo;
class Bar() {
const FIZZ = 'hello';
public function getData() {
//retrieve $data from database
return $data;
}
}
class Buzz() {
public function returnResult() {
$result = Foo\Bar->getData();
if ($result !== Foo\Bar::FIZZ) { // if result is different than my constant, return it
return $result;
}
return false;
}
}
在我的测试中:
use PHPUnit\Framework\TestCase;
use Mockery;
use Foo;
class BuzzTest extends TestCase {
\Mockery::getConfiguration()->setConstantsMap([
'Bar' => [
'FIZZ' => 'hello',
]
]);
public function testBuzzRejectsIfEqual(): void {
$externalMock = \Mockery::mock('overload:\Foo\Bar')
->shouldReceive('getData')
->andReturn('hello');
$obj = new \Foo\Buzz();
$actual = $obj->returnResult();
$this->assertEquals($actual, false);
}
}
解决方案
感谢这篇很棒的文章https://blog.gougousis.net/mocking-static-methods-with-mockery/我终于能够使用命名模拟来完成这项工作。
use PHPUnit\Framework\TestCase;
use Mockery;
use Foo;
class BuzzTest extends TestCase {
public function testBuzzRejectsIfEqual(): void {
$externalMock = \Mockery::namedMock(Foo\Bar:class, BarStub::class)
->shouldReceive('getData')
->andReturn('hello');
$obj = new \Foo\Buzz();
$actual = $obj->returnResult();
$this->assertEquals($actual, false);
}
}
class BarStub {
const FIZZ = 'hello';
}
推荐阅读
- laravel-8 - 无法使用谷歌一键登录按钮登录社交名流
- javascript - jQuery.on() 委托:用于动态构建的 HTML 的稍微复杂的选择器
- c++ - VS2019 上的 C++ 代码生成错误 LNK2005 和 LNK1169
- r - R中ugarchfit函数的循环函数
- salesforce - 向 Salesforce 验证外部 Web 应用程序时出现 CORS 问题
- automation - 在LabVIEW中设计水箱工厂流程
- c# - 使用四元数旋转对象
- ms-word - 更改 ms 字字段中的路径以引用新文件时,如何使其自动更新/刷新?
- javascript - @schematics/angular:library VS @nrwl/angular:library
- javascript - 使用 Codecept Gherkin 的多步骤定义文件