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);
}