我正在尝试为我的一个控制器编写一个非常基本的测试
/**
* THIS IS MY CONTROLLER. $this->badge is a repository
* @return \Illuminate\Http\Response
*/
public function index()
{
return view('badges.index')->with([
'badges' => $badges = $this->badge->all()
]);
}
我正在使用返回Eloquent集合的存储库。我的基本测试如下:
public function testItShowsAllBadges()
{
// Arrange
//DISABLE AUTH MIDDLEWARE ON THIS ROUTE
$this->withoutMiddleware();
// MOCK THE REPO
$this->badge->shouldReceive('all')->andReturn(new Illuminate\Support\Collection);
// Act
$response = $this->action('GET', 'BadgeController@index');
// Assert
$this->assertResponseOk();
$this->assertInstanceOf('Illuminate\Support\Collection', $response->original->getData()['badges']);
$this->assertViewHas('badges');
}
此测试失败并显示“尝试获取非对象属性”消息。这是因为我在视图中执行了Auth :: user() - >。
所以我需要模仿视图,但我不知道如何。有人可以提供建议吗?
其他SO答案似乎不起作用,只会导致测试中出现关于Mock上不存在的方法的异常。我曾尝试过例如:
View::shouldReceive('make')
->once()
->andReturn(\Mockery::self())
在调用路径之前添加此内容会导致500错误'此模拟对象上不存在方法Mockery_1_Illuminate_View_Factory :: with()'。我试过加入
->shouldReceive('with')
->once()
->andReturn(\Mockery::self());
但是,这会导致异常声明此Mock对象上不存在getData()。即使删除该断言,assertViewHas('badges')也无法说响应不是视图。
另外我还没有理解View :: shouldReceive ...是否是测试的Arrange或Assert阶段的一部分?我理解它是安排的一部分,应该在$ this->行动之前(... ..)