Prophecy

Dummy

$dummy = $this->prophesize(SomeClass::class);
$sut->action($dummy->reveal());

// with phpspec
class MarkdownSpec extends ObjectBehavior
{
    function it_converts_text_from_an_external_source(Reader $reader)
    {
        // $reader is a Dummy at this point because we've added
        // no behaviour nor made any assertions on its methods.
    }
}

Stub

$stub = $this->prophesize(SomeClass::class);
$stub->getSomething()->willReturn('foo');
$sut->action($stub->reveal());

// with phpspec
class MarkdownSpec extends ObjectBehavior
{
    function it_converts_text_from_an_external_source(Reader $reader)
    {
        $reader->getMarkdown()->willReturn("Hi, there");

        // $reader is now a Stub because we are controlling its behaviour.

        $this->toHtmlFromReader($reader)->shouldReturn("Hi, there");
    }
}

Mock

$mock = $this->prophesize(SomeClass::class);
$mock->doSomething('bar')->shouldBeCalled();
$sut->action($mock->reveal());

// with phpspec
class MarkdownSpec extends ObjectBehavior
{
    function it_outputs_converted_text(Writer $writer)
    {
        $writer->writeText("Hi, there")->shouldBeCalled();

        // Adding an assertion before the double is used makes it a Mock.

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

Spy

$spy = $this->prophesize(SomeClass::class);
$sut->action($spy->reveal());
$spy->doSomething('bar')->shouldHaveBeenCalled();

// with phpspec
class MarkdownSpec extends ObjectBehavior
{
    function it_outputs_converted_text(Writer $writer)
    {
        $this->outputHtml("Hi, there", $writer);

        // Adding an expectation after the double is used makes it a Spy.
        $writer->writeText("Hi, there")->shouldHaveBeenCalled();
    }
}