LoginSignup
1

More than 5 years have passed since last update.

phpspec2.2の新機能 - コラボレータの自動生成

Last updated at Posted at 2015-04-26

phpspec2.2では、コラボレータの自動生成機能が追加されました。公式サイトのコードを例として使うと:

spec/MarkdownSpec.php
<?php

namespace spec;

use PhpSpec\ObjectBehavior;
use Prophecy\Argument;
use Markdown\Writer;

class MarkdownSpec extends ObjectBehavior
{
    function let(Writer $writer)
    {
        $this->beConstructedWith($writer);
    }

    function it_outputs_converted_text(Writer $writer)
    {
        $this->beConstructedWith($writer);
        $writer->writeText("<p>Hi, there</p>")->shouldBeCalled();

        $this->outputHtml("Hi, there");
    }
}

これはMarkdownクラスのスペックです。Markdownクラスはコンストラクタの引数としてMarkdown\Writerのインスタンスを受け取り、outputHtml()メソッドを呼び出すと、MarkdownをHTMLに変換した結果をそのライターに出力します。

さて、2.1までは実装が全くない状態でこのスペックを実行すると、Markdown\Writerクラスが無いというエラーになっていました。(Markdown\Writerを自分で作れば、Markdownクラスの自動生成は2.0からできていました)

$ vendor/bin/phpspec run
Markdown
  16  - it outputs converted text
      exception [exc:ReflectionException("Class Markdown\Writer does not exist")
] has been thrown.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
37ms

2.2からはコラボレータも自動生成してくれます。

$ vendor/bin/phpspec run
Markdown
  16  - it outputs converted text
      collaborator does not exist : Markdown\Writer

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
35ms


  Would you like me to generate an interface `Markdown\Writer` for
  you?
                                                               [Y/n]

Interface Markdown\Writer created in C:\path\to\src\Markdown\Writer.php.

Markdown
  16  - it outputs converted text
      method `Double\Writer\Writer\P1::writeText()` is not defined.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
44ms


  Would you like me to generate a method signature
  `Markdown\Writer::writeText()` for you?
                                                               [Y/n]

  Method signature Markdown\Writer::writeText() has been created.

Markdown
  16  - it outputs converted text
      class Markdown does not exist.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
39ms


  Do you want me to create `Markdown` for you?
                                                               [Y/n]

Class Markdown created in C:\path\to\src\Markdown.php.

Markdown
  16  - it outputs converted text
      method Markdown::__construct not found.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
40ms


  Do you want me to create `Markdown::__construct()` for you?
                                                               [Y/n]

  Method Markdown::__construct() has been created.

Markdown
  16  - it outputs converted text
      method Markdown::outputHtml not found.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   /  failed: 0%   / broken: 100%
/  1 examples
2 specs
1 example (1 broken)
36ms


  Do you want me to create `Markdown::outputHtml()` for you?
                                                               [Y/n]

  Method Markdown::outputHtml() has been created.

Markdown
  16  - it outputs converted text
      some predictions failed:
        Double\Writer\Writer\P1:
          No calls been made that match:
            Double\Writer\Writer\P1->writeText(exact("<p>Hi, there</p>"))
          but expected at least one.

/  skipped: 0%  /  pending: 0%  /  passed: 0%   / failed: 100%  /  broken: 0%
/  1 examples
2 specs
1 example (1 failed)
50ms

結果、以下の2つのファイルができました。

src/Markdown.php
<?php

class Markdown
{

    public function __construct($argument1)
    {
        // TODO: write logic here
    }

    public function outputHtml($argument1)
    {
        // TODO: write logic here
    }
}
src/Markdown/Writer.php
<?php

namespace Markdown;

interface Writer
{

    public function writeText($argument1);
}

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1