我创建了一个 mail包装类。我知道有很多库可以发送电子邮件,但我想学习 TDD……所以,我创建了一些测试并且我有一些代码。现在我可以在构造函数上设置电子邮件地址并对其进行验证......如果电子邮件地址错误,则会引发异常。电子邮件地址是唯一一个必填字段...我没有设置和获取,因为用户将在构造函数上设置所有电子邮件数据。
现在,我要编写发送测试。我不知道如何开始。如果我不想拥有 setter 和 getter,我如何测试这些值是否存在(主题、邮件正文、标题)?如何测试是否可以发送电子邮件?
现实世界的 TDD 示例对我来说很难。我已经尝试了解它,我已经阅读了很多东西,但我无法测试真正的代码。
谢谢。
最佳答案
由于您链接到邮件功能,对 mail
的调用可能已硬编码到您的代码中。所以看看
安装 testhelper extension并模拟对 mail
的调用。然后让模拟验证它在调用包装器的发送方法时使用正确的值调用,例如在某处定义自定义邮件功能:
function mail_mock()
{
$allThatWasPassedToTheFunction = func_get_args();
return $allThatWasPassedToTheFunction;
}
然后在你的 send()
测试中,做类似的事情
public function testSendReceivesExpectedValues()
{
// replace hardcoded call to mail() with mock function
rename_function('mail', 'mail_orig');
rename_function('mail_mock', 'mail');
// use the wrapper
$testClass = new MailWrapper('foo@example.com');
$results = $testClass->send();
// assert the result
$this->assertSame('foo@example.com', $results[0]);
$this->assertSame('Default Title', $results[1]);
$this->assertSame('Default Message', $results[2]);
}
请注意,上面假设您的发送函数将返回 mail()
调用的结果。
通常,您总是会尝试用 Mock or a Stub 替换外部子系统,例如 sendmail 或数据库或文件系统。 ,因此您可以集中精力测试自己的代码,与外部子系统隔离。您不需要测试 mail
是否真的有效。
关于PHPUnit 测试实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6346690/