我有一个我试图在 PhpSpec 中测试的 Laravel5 应用程序的方法,但它一直抛出以下错误:
App/Helpers/RecurrRule
37 ! it should return a recurrence collection method call:
Double\ChurchRepositoryInterface\P6->getChurchTimezone(1) was not expected.
Expected calls are:
- getChurchTimeZone(exact(1))
该方法传递了一个数组,我想模拟模型的 getChurchTimezone 方法返回一个时区。
方法:
public function __construct(Rule $rule, ArrayTransformer $arrayTransformer, ChurchRepositoryInterface $church)
{
$this->rule = $rule;
$this->arrayTransformer = $arrayTransformer;
$this->church = $church;
}
public function getRecurrenceCollection($schedule)
{
$timezone = $this->church->getChurchTimezone($schedule['church_id']);
// more code
}
在我的其他规范中,我经常做类似的事情$double->method('someArgument')->willReturn('blah')
,但由于某种原因,这种特定情况不起作用,我对为什么感到困惑。
我试过给它一个数组的副本,我试过直接给它一个整数,我试着把 $this->church->getChurchTimezone 拉到它自己的方法中,然后给它一个数组或一个整数,但无论如何PhpSpec 总是以“准确”的方式返回预期的调用错误。
规格:
class RecurrRuleSpec extends ObjectBehavior
{
protected $schedule = [
'church_id' => 1,
'start' => '2014-11-21 10:36:07',
'end' => '2014-11-21 11:36:07',
'recurr_rule' => 'FREQ=WEEKLY;BYDAY=SU;',
'recurr_until' => '2015-02-22 10:36:07',
];
function it_is_initializable()
{
$this->shouldHaveType('App\Helpers\RecurrRule');
}
/**
* Setup our mock, with doubles matching our constructor
*/
function let($rule, $arrayTransformer, $church)
{
$rule->beADoubleOf('\Recurr\Rule');
$arrayTransformer->beADoubleOf('\Recurr\Transformer\ArrayTransformer');
$church->beADoubleOf('\App\Repositories\ChurchRepositoryInterface');
$this->beConstructedWith($rule, $arrayTransformer, $church);
}
function it_should_return_a_recurrence_collection($rule, $arrayTransformer, $church)
{
$church->getChurchTimeZone(1)->willReturn('Europe/Dublin');
// $church->getChurchTimeZone($this->schedule['church_id'])->willReturn('Europe/Dublin');
// $church->getChurchTimeZone(Argument::any())->willReturn('Europe/Dublin');
$rule->createFromString()->willReturn([]);
$arrayTransformer->transform()->willReturn([]);
$this->getRecurrenceCollection($this->schedule)->shouldReturn([]);
}
这是我的应用程序中其他地方的另一个规范示例,它使用相同的方法并通过
function it_should_return_a_one_dimensional_numeric_array_of_servers($config)
{
$expectedResult = ['domain.com', 'domain2.com'];
$config->get('servers')->willReturn($this->configGetReturn);
$this->serverArray()->shouldBeArray();
$this->serverArray()->shouldEqual($expectedResult);
}