Laravel 5无法模拟视图

时间:2015-07-02 16:39:38

标签: unit-testing laravel testing laravel-5 mockery

我正在尝试为我的一个控制器编写一个非常基本的测试

/**
 * 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->行动之前(... ..)

0 个答案:

没有答案