1

所以我有一个我正在模拟的对象,它有用于发送电子邮件的方法。我已经从一个静态类转到了一个具体类,因为我在使用 Mockery 测试静态类时遇到了问题。

但是,我现在发现,当保存一个雄辩的模型时,它会引发一个触发侦听器的事件。这个监听器负责启动对模拟对象方法的调用。

我发现当我执行以下操作时,它会起作用。

$model = factory(MyClass::class)->make();
$model->property = 'value';
$model->save()
$this->mailer->shouldHaveReceived('methodName')->with($arg1, $arg2, $arg3);

每次抱怨模拟对象上不存在该方法时都会失败,最糟糕的是,如果我进入调用模拟对象方法的侦听器并执行类似的操作

echo '<pre>'.print_r(get_class_methods($this->mailer), true).'</pre>'; exit;

它表明该方法实际上位于从 get_class_methods 返回的方法数组中。

现在这是踢球者。如果我执行以下操作,一切正常,并且测试通过且没有任何错误:

$this->mailer->shouldReceive('methodName');
$model = factory(MyClass::class)->make();
$model->property = 'value';
$model->save()

现在我一直在阅读Mockery Gotchas并且看起来如果我的类正在调用对象上真正不存在的方法,___call那么这个错误将是预期的。

但是,我的邮件程序类没有扩展任何其他具有__call方法的类,也没有在该类上定义该方法。

然而,你可能知道也可能不知道 Eloquent 模型实际上使用了魔法___call方法。但是我不是用 Mockery 模拟模型,我在 Laravel 中使用工厂模型,但我也没有检查方法调用的模型对象,我正在检查我的具体邮件类以进行方法调用。

任何人都知道为什么我可能会从 Mockery 那里得到这种行为?

我正在使用以下代码在 Laravel 5.2 中创建我的模拟对象

public function mock($class)
{
    $mock = Mockery::mock($class);
    $this->app->instance($class, $mock);
    return $mock;
}

$this->mailer = $this->mock('Namespace\Classname');
4

1 回答 1

0

你是怎么创作的$this->mailer?为了能够使用 spy 功能->shouldHaveReceived,您需要在创建测试替身后调用Mockery::spy($className)或调用该方法。shouldIgnoreMissingMockery::mock($className)

于 2016-03-24T19:46:33.983 回答