使用 Mockery 和 PHPUnit 模拟 class 的常量和方法
Mock a class's constant and method with Mockery and PHPUnit
Mockery 的新手...我正在测试一个 class(在我过度简化的乏味示例中的 Buzz),它调用另一个 class(Foo->getData) 的方法,我有一个mock 模拟这个方法,效果很好。现在我添加了对 class 常量 (Foo::FIZZ) 的检查,并且由于常量未定义,我的测试中断了。
我尝试通过映射常量来添加常量,如 Mockery Docs here 所示,但它仍然说常量 FOO\Bar::FIZZ 未定义。我一直无法找到任何其他方法来将常量设置为我的 Mockery 模拟。如有任何帮助,我们将不胜感激!
约束:由于模拟 class 中的一些 hard dependencies,我必须使用重载 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';
}
Mockery 的新手...我正在测试一个 class(在我过度简化的乏味示例中的 Buzz),它调用另一个 class(Foo->getData) 的方法,我有一个mock 模拟这个方法,效果很好。现在我添加了对 class 常量 (Foo::FIZZ) 的检查,并且由于常量未定义,我的测试中断了。
我尝试通过映射常量来添加常量,如 Mockery Docs here 所示,但它仍然说常量 FOO\Bar::FIZZ 未定义。我一直无法找到任何其他方法来将常量设置为我的 Mockery 模拟。如有任何帮助,我们将不胜感激!
约束:由于模拟 class 中的一些 hard dependencies,我必须使用重载 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';
}