PHPUnit测试真实的例子

tho*_*hom 19 php email tdd phpunit wrapper

我已经创建了一个邮件包装器类.我知道有很多库可以发送电子邮件,但我想学习TDD ...所以,我已经创建了一些测试,我有一些代码.现在我可以在构造函数上设置电子邮件地址并验证它......如果电子邮件地址错误,则会引发异常.电子邮件地址是唯一一个必填字段...我没有设置和获取因为用户将在构造函数上设置所有电子邮件数据.

现在,我要编写发送测试.我不知道如何开始它.如果我不想有定位器和吸气剂,我怎么能测试值是否存在(主题,邮件正文,标题)?如何测试是否可以发送电子邮件?

现实世界的TDD示例对我来说很难.我试图了解它,我已经阅读了很多东西,但我无法测试真正的代码.

谢谢.

Gor*_*don 16

由于您链接到邮件功能,因此mail可能会将调用硬编码到您的代码中.所以看看吧

安装testhelper扩展并模拟调用mail.然后让模拟验证在调用包装器的send方法时使用正确的值调用它,例如在某处定义自定义邮件功能:

function mail_mock()
{
    $allThatWasPassedToTheFunction = func_get_args();
    return $allThatWasPassedToTheFunction;
}
Run Code Online (Sandbox Code Playgroud)

然后在你的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]);
}
Run Code Online (Sandbox Code Playgroud)

请注意,上述假设您的发送功能将返回mail()呼叫结果.

通常,您将始终尝试使用Mock或Stub替换外部子系统(如sendmail或数据库或文件系统),以便您可以专注于独立于外部子系统测试自己的代码.你不需要测试它mail确实有效.

另见http://www.phpunit.de/manual/3.6/en/test-doubles.html