PHPUnit测试真实的例子



Answers

在纯粹的单元测试中,您并不真正测试是否发送了真正的电子邮件,而是调用了适当的编程单元(本例中为mail函数)。 我真的不知道如何测试mail功能是否真正起作用,因为我没有深入的了解电子邮件如何工作。 所以,我只会写我如何做单元测试。

你可以让你的类构造函数接受一个可选的参数,这个函数实际上是发送电子邮件的工作。 默认情况下,它将是mail功能,但是在你的测试设置中,你提供了你的特殊功能,它将实际检查正确的主题,正文和标题存在。

考试:

<?php

class EmailerTest extends PHPUnit_Framework_TestCase
{
  public function testMailFunctionIsCalledWithCorrectArguments()
  {
    $actualSubject, $actualBody, $actualHeaders;
    $mailFunction = function ($subject, $body, $headers)
        use (&$actualSubject, &$actualBody, &$actualHeaders) {
      $actualSubject = $subject;
      $actualBody = $body;
      $actualHeaders = $headers;
    };

    $emailer = new Emailer($options, $mailFunction);
    $emailer->send();

    $this->assertEquals('Expected subject', $actualSubject);
    $this->assertEquals('Expected body', $actualBody);
    $this->assertEquals('Expected headers', $actualHeaders);
  }
}

而被测班:

<?php

class Emailer
{
  public function __construct($options, $mailFunction = 'mail')
  {
    $this->subject = $options->subject;
    $this->body = $options->body;
    // etc.
    $this->mailFunction = $mailFunction;
  }

  public function send()
  {
    // find out $subject, $body, $headers, and then...

    call_user_func_array($this->mailFunction, array(
      $subject,
      $body,
      $headers
    ));
  }
}

这是某种伪代码,因为我留下了一些值来完成或实现。 主要的一点是你应该为你正在测试的课程的合作者提供测试双打。

在这种情况下,它只是一个函数(我已经使用了一些PHP 5.3)的特性,但它可能是一个对象实例,你会传递给被测试的类。

Question

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

现在,我要写发送测试。 我不知道如何启动它。 我怎么能测试,如果价值是否存在(主题,邮件正文,标题),如果我不想有setters和getters? 我如何测试电子邮件是否可以发送?

真实世界的TDD例子对我来说很难。 我试图了解它,我已经读了很多东西,但我不能测试真正的代码。

谢谢。






Links