gpt4 book ai didi

unit-testing - 闭包内的 mock 模拟方法

转载 作者:行者123 更新时间:2023-12-04 02:20:43 24 4
gpt4 key购买 nike

我在 call_user_func() 示例调用的闭包内有问题单元测试方法:

public function trans($lang, $callback)
{
$this->sitepress->switch_lang($lang);
call_user_func($callback);
}

在 Controller 上:

public function sendMail()
{
$foo = $baz = 'something';
$mail = $this->mailer;
$this->helper->trans_c('en', function() use($foo, $baz, $mail) {
$mail->send('Subject', $foo, $baz);
});
}

测试用例:

public function testSomething()
{
$helperMock = Mockery::mock('Acme\Helper');
$helperMock->shouldReceive('trans_c')->once(); // passed

$mailMock = Mockery::mock('Acme\Mail');
$mailMock->shouldReceive('send')->once(); // got should be called 1 times instead 0

$act = new SendMailController($helperMock, $mailMock);
$act->sendMail();
}

如何确保 ->send() 方法在闭包 trans_c() 中被调用

我试过

$helperMock->shouldReceive('trans_c')->with('en', function() use($mailMock) {
$mailMock->shouldReceive('send');
});

运气不好。 :(

trans_c 的第二个参数中传递 Mockery::type('Closure') 效果很好,但我真的需要确保该方法 调用来自邮件程序类的发送

最佳答案

模拟类默认不执行真实代码。如果您模拟帮助程序,它将检查是否正在进行调用,但不会执行匿名函数。

使用 mockery,您可以配置期望,以便执行真正的方法:passthru();

试试这个:

$helperMock = Mockery::mock('Acme\Helper');
$helperMock
->shouldReceive('trans_c')
->once()
->passthru()
;

这在 the docs 中有解释.

编辑

也许您真的不需要模拟助手。如果您模拟 Mail 类并期望发送方法被调用一次,只需让真正的助手来完成即可。

关于unit-testing - 闭包内的 mock 模拟方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30095383/

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