在 Mockery 中设置由代码设置的对象
Set object set by code in Mockery
我有下面的代码要测试。
// $generator, $locale, $site are parameters.
// It is just a part of real code.
$text = new Text();
$text->setType($generator->getType())
->setLocale($locale)
->setSite($site->getId());
/** @var $site \namespace\Site */
$site->addText($text);
为了对此进行测试,我正在使用 Mockery 模拟网站。
在测试中,我一般都想做
$text = $site->getText();
$this->assertInstanceOF('\namespace\Text', $text);
$this->assertSame($generator->getType(), $text->getType());
$this->assertSame($locale, $text->getLocale());
$this->assertSame($site->getId(), $text->getSite());
在制作 mock 时,我想模拟 return 由原始代码创建并在行 $site->addText($site)
中设置的 Text 实例。我试过了
$text = new Text();
$site = Mockery::mock(Site::class)
->shouldReceive('addText')
->with($text)
->andReturnUsing(function() {
$args = func_get_args();
return $args[0];
})
->getMock();
这个return me 文本对象设置在模拟代码中。讽刺的是,有什么方法可以让我在原始代码中创建文本对象?
此时可以使用Mockery::on()
方法。参考 argument validation docs 。在这里你可以传递一个闭包来接收传递给 addText 方法的参数。您还可以在此闭包中使用 PHPUnit 断言对 $text
参数进行断言。
像这样:
$site = Mockery::mock(Site::class)
->shouldReceive('addText')
->with(Mockery::on(function($text) {
$this->assertInstanceOF('\namespace\Text', $text);
//More assertions
return true; //You must return true, otherwise the expectation will never pass regardless of the assertions above.
}));
我有下面的代码要测试。
// $generator, $locale, $site are parameters.
// It is just a part of real code.
$text = new Text();
$text->setType($generator->getType())
->setLocale($locale)
->setSite($site->getId());
/** @var $site \namespace\Site */
$site->addText($text);
为了对此进行测试,我正在使用 Mockery 模拟网站。
在测试中,我一般都想做
$text = $site->getText();
$this->assertInstanceOF('\namespace\Text', $text);
$this->assertSame($generator->getType(), $text->getType());
$this->assertSame($locale, $text->getLocale());
$this->assertSame($site->getId(), $text->getSite());
在制作 mock 时,我想模拟 return 由原始代码创建并在行 $site->addText($site)
中设置的 Text 实例。我试过了
$text = new Text();
$site = Mockery::mock(Site::class)
->shouldReceive('addText')
->with($text)
->andReturnUsing(function() {
$args = func_get_args();
return $args[0];
})
->getMock();
这个return me 文本对象设置在模拟代码中。讽刺的是,有什么方法可以让我在原始代码中创建文本对象?
此时可以使用Mockery::on()
方法。参考 argument validation docs 。在这里你可以传递一个闭包来接收传递给 addText 方法的参数。您还可以在此闭包中使用 PHPUnit 断言对 $text
参数进行断言。
像这样:
$site = Mockery::mock(Site::class)
->shouldReceive('addText')
->with(Mockery::on(function($text) {
$this->assertInstanceOF('\namespace\Text', $text);
//More assertions
return true; //You must return true, otherwise the expectation will never pass regardless of the assertions above.
}));