我可以在功能测试中测试发送的电子邮件数量,但我无法测试单元中发送的电子邮件的数量。
我正在测试一个命令,它根据测试设置发送不同数量的电子邮件。
当我使用:
// tests
public function testShouldSendATestEmailWhenNoParametersArePassedIn() {
$this->assertSame('Success! (Provisionally, as long as no errors follow.)' . PHP_EOL, static::run_verify_send_email_command());
$this->tester->seeEmailIsSent(3);
}
我得到以下错误:
[TypeError] Argument 1 passed to SymfonyComponentHttpKernelProfilerProfiler::loadProfileFromResponse() must be an instance of SymfonyComponentHttpFoundationResponse, null given
如果我注释掉$this->tester->seeEmailIsSent(3);
,那么测试将运行并涵盖适当的代码。
Profiler似乎只是一个功能测试(即使用HTTP,而不是命令行),而不是一个单元测试。如何在单元测试中测试Symfony Command发送的电子邮件数量?
我再次查看了代码,并意识到升级codeception/module symfony没有帮助。seeEmailIsSent
只有在通过测试发出模拟HTTP请求时才起作用。
单元测试中正确的方法是将mailer类的mock注入到正在测试的类或函数中。
public function testEmailIsSent()
{
$mailerMock = $this->createMock(SymfonyComponentMailer::class);
$mailerMock->expect($this->once())->method('send');
$testInstance = new MyClass($mailerMock);
$testInstance->toSomething();
}
有关模拟的更多信息,请访问https://phpunit.readthedocs.io/en/9.5/test-doubles.html