【问题标题】:return model instance from controller to test class in laravel从控制器返回模型实例到 laravel 中的测试类
【发布时间】:2018-04-06 19:06:23
【问题描述】:

我正在使用 Phpunit 在 laravel 中进行单元测试。情况是我必须将模型实例从控制器返回到测试类。在那里我将使用该对象的属性来测试一个断言。我怎样才能做到这一点?

目前我正在将该实例 json 编码到响应中。并以一种有效但丑陋的方式使用它。需要更清晰的方法。

这是我的测试课:

/** @test
*/
function authenticated_user_can_create_thread()
{
    //Given an authenticated user

    $this->actingAs(factory('App\User')->create());

    //and a thread

    $thread = factory('App\Thread')->make();

    //when user submits a form to create a thread

    $created_thread = $this->post(route('thread.create'),$thread->toArray());

    //the thread can be seen

    $this->get(route('threads.show',['channel'=>$created_thread->original->channel->slug,'thread'=>$created_thread->original->id]))
        ->assertSee($thread->body);
}

这是控制器方法:

public function store(Request $request)
{
    $thread = Thread::create([
        'user_id'=>auth()->id(),
        'title'=>$request->title,
        'body'=>$request->body,
        'channel_id'=>$request->channel_id,
    ]);

    if(app()->environment() === 'testing')
    {
       return response()->json($thread);   //if request is coming from phpunit/test environment then send back the creted thread object as part of json response
    }

    else 
        return redirect()->route('threads.show',['channel'=>$thread->channel->slug,'thread'=>$thread->id]);
}

正如您在测试类中看到的,我在 $created_thread 变量中接收到从控制器返回的对象。但是,控制器返回的是 Illuminate\Foundation\Testing\TestResponse 的实例,因此嵌入在此响应中的 THREAD 不容易提取。你可以看到我在做 --> $created_thread->original->channel->slug,'thread'=>$created_thread->original->id]。但我相信有更好的方法来实现同样的目标。

谁能指引我正确的方向?

【问题讨论】:

    标签: phpunit laravel-5.4 laravel-testing


    【解决方案1】:

    PHPUnit 是一个单元测试套件,因此得名。单元测试是,通过 定义,为每个单元编写测试——即每个类,每个 方法——尽可能与其他部分分开 系统。用户可以使用的每一件事,你都想尝试测试它—— 并且只有它,除了其他所有东西——按规定发挥作用。

    你的问题是,没有什么要测试的。您还没有创建任何具有可测试逻辑的方法。测试控制器的动作是没有意义的,因为它只是证明控制器正在工作,这是 Laravel 的创建者需要检查的事情。

    【讨论】:

    • 我在这里测试经过身份验证的用户可以创建线程的功能。您可以在测试方法的最后一行看到断言,当用户尝试在浏览器中访问它时,创建的线程是可见的。我不是在这里测试控制器动作!事实上,这正是 Jeffery 在 latacast 中的做法!!
    • 不过,身份验证和数据持久化是 laravel 的核心功能,对吧?无论如何,既然你想这样做,请尝试检查您的数据是否以这种方式保存laravel.com/docs/5.5/database-testing。环境条件是一个很大的禁忌:) 这是一个有用的单元测试的好例子github.com/laravel/framework/blob/5.5/tests/Config/… 正如你所看到的,这个测试设置了一个类并测试它的行为。
    猜你喜欢
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 1970-01-01
    • 2014-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多