我有一个类myModel
,使数据库调用。因此,我想要存根,这样它就不会进行任何这些昂贵的调用。
public function myFunction($limit)
{
$this->doThing();
}
private function doThing()
{
$result = $this->myModel
->select('thing')
->groupBy('name')
->orderBy('count', 'desc')
->get;
// do stuff with $result
}
因此,要存根模型的方法进行调用,我使用
/** @test */
public function my_test()
{
$stuff = new Collection(['person1', 'person2', 'person3',]);
$myModelMock = m::mock(MyModel::class, [
'select->groupBy->orderBy->get' => $stuff
]);
App::instance(MyModel::class, $myModelMock);
$myOtherClass = App::make(OtherClassWhereMyModelIsInjectedAutomagically::class);
$myOtherClass->myFunction();
}
工作完美,输出$result
作为我在测试中定义的$stuff
的集合。
但是,我还想确保流畅接口函数只被调用一次。我理解这些函数是在私有方法内部调用的,但这并不重要,因为我没有测试私有函数本身。
所以当我尝试使用
/** @test */
public function query_ran_once()
{
$stuff = new Collection(['person1', 'person2', 'person3',]);
$myModelMock = m::mock(MyModel::class, [
'select->groupBy->orderBy->get' => $stuff,
'where->update' => null,
'whereIn->update' => null
]);
$myModelMock
->shouldReceive('select->groupBy->orderBy->get')
->times(1)
App::instance(MyModel::class, $myModelMock);
$myOtherClass = App::make(OtherClassWhereMyModelIsInjectedAutomagically::class);
$myOtherClass->myFunction();
}
我得到一个错误,最终是$result
是null
-这意味着它不再被我的测试中的$stuff
数据所取代。
在运行模拟期望之前如何使用存根数据?
因为你必须在这里添加andReturn
:
$collection = m::mock('Illuminate'Database'Eloquent'Collection::class)
$myModelMock
->shouldReceive('select->groupBy->orderBy->get')
->times(1)
->andReturn($collection);
在这种情况下,最好返回模拟Collection
或Collection
。