Laravel 5.0 用户 Eloquent 模型嘲讽

Posted

技术标签:

【中文标题】Laravel 5.0 用户 Eloquent 模型嘲讽【英文标题】:Laravel 5.0 User Eloquent Model Mockery 【发布时间】:2016-01-08 10:47:34 【问题描述】:

一段时间以来,我一直在尝试在 Laravel 应用程序的 Controller 测试中使用 Mockery,但似乎没有任何效果。

用户控制器.php

class UserController extends Controller

    protected $user;

    public function __construct(User $user)
    
        $this->user = $user;
    

    /**
     * Display a listing of the resource.
     * GET /user
     *
     * @return Response
     */
    public function index()
    
        $users = $this->user->orderBy('created_at', 'desc')->paginate(6);
        return view('users.index', compact('users'));
    

我的测试:

class UserControllerTest extends TestCase 

    protected $user;
    protected $builder;
    protected $paginator;

    public function setUp()
    
        parent::setUp();
    

    public function tearDown()
    
        Mockery::close();
    

    /**
     * A basic functional test example.
     *
     * @return void
     */
    public function testIndex()
    
        $this->user = Mockery::mock('App\User');

        $this->user
            ->shouldReceive('orderBy')
            ->once()
        ;

        $this->app->instance('App\User', $this->user);
        $response = $this->call('GET', 'users');

        $this->assertEquals(200, $response->getStatusCode());
    


当我运行 PHPUnit 时,我得到了输出:

[Symfony\Component\Debug\Exception\FatalErrorException] 在非对象上调用成员函数 paginate()

当我添加 ->andReturn($this->user) 时:

$this->user
        ->shouldReceive('orderBy')
        ->once()
        ->andReturn($this->user)
 ;

我得到 PHPUnit 的输出:

Failed asserting that 500 matches expected 200.
Expected :200
Actual   :500

当我打印响应时,其中包含以下错误:

Method Mockery_0_App_User::paginate() does not exist on this mock object

当我模拟 paginate() 函数时,它在视图中的“getIterator”函数上再次失败。

那我做错了什么? 我在这里观看了教程,阅读了文章和相关答案,但尚未找到解决方案。

【问题讨论】:

【参考方案1】:

您必须模拟分页,并且它必须返回一组用户。

你的期望应该是这样的:

$this->user
    ->shouldReceive('orderBy->paginate')
    ->once()
    ->andReturn($userArray);

其中$userArray 是一个数组,用户在表单上,​​您将在视图中使用它。我想这就是你得到“getIterator”错误的原因,可能你返回了一些无法正确迭代的东西。

【讨论】:

Paginate有点嘲讽的态度啊!

以上是关于Laravel 5.0 用户 Eloquent 模型嘲讽的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Eloquent 嵌套关系枢轴与约束

Php 变量未传递到 whereHas 函数 - Laravel Eloquent

Laravel - Eloquent:使用用户发布表从用户那里获取帖子

Laravel 4.2 Eloquent 获取特定用户和特定角色

如何用 eloquent 在 Laravel 中只获取一个用户数据?

Laravel 5.3 Eloquent 关系 - 用户、角色、页面和权限