0

我试图嘲笑Carbon::parse($date)->format("Y"),但我不知道该怎么做。

这是我到目前为止所拥有的:

public function testGetYear2014FromPost()
{
    $mock = Mockery::mock("DateFormatter");
    $mock->shouldReceive("parse")
        ->with("2014-02-08 16:23:33")
        ->once()
        ->andReturn($mock);
    $mock->shouldReceive("format")
        ->with("Y")
        ->once()
        ->andReturn("2014");

    $this->article->setDateFormatter($mock);

    $this->assertEquals("2014", $this->article->getYear());
}
4

1 回答 1

2

我只知道模拟这样的方法链的两种方法:

  1. 找出每个方法的返回值并模拟:

$mock1 = Mockery::mock("SomeOtherClass")
$mock1->shouldReceive("format")->with("Y")->once()->andReturn("2014");

$mock0 = Mockery::mock("DateFormatter")
$mock0->shouldReceive("parse")
    ->with("2014-02-08 16:23:33")->once()->andReturn($mock1);

您必须弄清楚该parse方法返回的类,然后将其设置为模拟对象并返回它。

  1. 如果您不想费心找出返回的类是什么,您可以用一个stdClass对象来伪造它:

$mock1 = new stdClass;
$mock1->format = function ($f) { return "2014"; };

$mock0 = Mockery::mock("DateFormatter")
$mock0->shouldReceive("parse")
    ->with("2014-02-08 16:23:33")->once()->andReturn($mock1);

这两种方法之间有一个重要区别:

  • 第一种方法需要做更多的工作,但它允许您为 Mockery 设置准确的期望,这将允许 PHPUnit 和 Mockery 在未满足期望时正确处理事情。

  • 第二个更容易一些,但你没有得到期望处理。但是,当您的期望未得到满足时,可以通过抛出异常来伪造它,如下所示:

$mock1 = 新标准类;
$mock1->格式=函数($f){
    如果 ($f!="Y") {
        抛出新异常;
    }
    返回“2014”;
};

$mock0 = 嘲弄::mock("DateFormatter")
$mock0->shouldReceive("解析")
    ->with("2014-02-08 16:23:33")->once()->andReturn($mock1);

然后,您可以在您的方法中添加一个@expectedException Exceptiondocblock 来测试它。

于 2014-05-22T18:36:01.130 回答