gpt4 book ai didi

php - mock 对象参数验证问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:08:14 25 4
gpt4 key购买 nike

考虑示例类(很抱歉它太复杂了,但它尽可能简洁):

class RecordLookup
{
private $records = [
13 => 'foo',
42 => 'bar',
];

function __construct($id)
{
$this->record = $this->records[$id];
}

public function getRecord()
{
return $this->record;
}
}

class RecordPage
{
public function run(RecordLookup $id)
{
return "Record is " . $id->getRecord();
}
}

class App
{
function __construct(RecordPage $page, $id)
{
$this->page = $page;
$this->record_lookup = new RecordLookup($id);
}

public function runPage()
{
return $this->page->run($this->record_lookup);
}
}

我想在模拟 RecordPage 的同时测试 App:

class AppTest extends \PHPUnit_Framework_TestCase
{
function testAppRunPage()
{
$mock_page = \Mockery::mock('RecordPage');

$mock_page
->shouldReceive('run')
->with(new RecordLookup(42))
->andReturn('bar');

$app = new App($mock_page, 42);

$this->assertEquals('Record is bar', $app->runPage());
}
}

注意:预期的对象参数 ->with(new RecordLookup(42))

我希望这会通过,但是 Mockery 返回抛出 No matching handler found for Mockery_0_RecordPage::run(object(RecordLookup))。该方法是意外的,或者它的参数不匹配该方法的预期参数列表

我假设这是因为对通过 with()new RecordLookup(42) === new RecordLookup(42) 预期的参数使用了严格比较> 评估为假。请注意 new RecordLookup(42) == new RecordLookup(42) 的计算结果为 true,因此如果有某种方法可以放松比较,它将解决我的问题。

是否有适当的方法来处理 Mockery 中预期的实例参数?可能是我使用不当?

最佳答案

你可以告诉 mock 应该接收一个 RecordLookup 实例(任何):

$mock_page
->shouldReceive('run')
->with(\Mockery::type('RecordLookup'))
->andReturn('bar');

但这将匹配 RecordLookup 的任何实例。如果您需要深入对象并检查它的值是否为 42,那么您可以使用自定义验证器:

$mock_page
->shouldReceive('run')
->with(\Mockery::on(function($argument) {
return
$argument instanceof RecordLookup &&
'bar' === $argument->getRecord()
;
}))
->andReturn('bar');

还有更多选项,详见 the docs .

关于php - mock 对象参数验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29917856/

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