【问题标题】:Automated tests in jenkins object instantiation errors Using Laravel phpunitjenkins 对象实例化错误中的自动化测试使用 Laravel phpunit
【发布时间】:2020-02-05 10:02:22
【问题描述】:

我正在使用 nginx 和 php7.3 在 aws linux 服务器上的 jenkins 中运行自动化测试。运行测试时出现以下错误

    1) Tests\Feature\admin\EventManagementTest::test_admin_can_edit_event_and_view_in_event_list
Error: Call to a member function path() on null

/var/lib/jenkins/workspace/answers-integration/tests/Feature/admin/EventManagementTest.php:134

2) Tests\Feature\admin\EventManagementTest::test_admin_can_soft_delete_event_and_does_not_appear_on_event_list
Error: Call to a member function path() on null

/var/lib/jenkins/workspace/answers-integration/tests/Feature/admin/EventManagementTest.php:190

函数 path() 位于我的事件模型中

在我的本地环境中,一切正常。每个测试都通过

对象没有被实例化,我不知道为什么

下面的代码是无法用雄辩的查询实例化对象的地方

 $event = Event::with('event_categories', 'event_topics')->find(1);

这发生在我的大多数测试中。下面是完整的测试代码

namespace Tests\Feature\admin;

use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Support\Facades\DB;
use Tests\TestCase;
use \App\Event;

class EventManagementTest extends TestCase
{
    use WithFaker, DatabaseMigrations;

    public function setUp(): void
    {
        parent::setUp();
        $this->seed();
    }


    public function test_admin_can_create_event_and_view_in_event_list()
    {
        //login as admin
        $admin = $this->signInAsAdmin();

        $attributes = [
            'event_name' => $this->faker->name,
            'event_description' => $this->faker->paragraph,
            'event_start_date_time' => $this->faker->date('Y-m-d H:i:s'),
            'event_end_date_time' => $this->faker->date('Y-m-d H:i:s'),
            'organisation_name' => $this->faker->company,
            'location' => $this->faker->address,
            'contact_name' => $this->faker->name,
            'contact_phone' => $this->faker->phoneNumber,
            'contact_email' => $this->faker->email,
            'contact_link' => $this->faker->url,
            'venue' => $this->faker->address,
            'event_categories' => [1,2],
            'event_topics' => [2,3]
        ];

        //create new event
        $this->post('/admin/events', $attributes);

        //retrieve event from database
        $event = Event::with('event_categories', 'event_topics')->find(1);

        //ensure the event data is in the database
        $this->assertDatabaseHas('events', ['event_name' => $attributes['event_name'], 'event_description' => $attributes['event_description']]);

        //ensure the data is in the pivot tables for categories
        foreach ($event->event_categories AS $event_category){
            $this->assertDatabaseHas('content_category_event', [
                'event_id' => $event_category->pivot->event_id,
                'content_category_id' => $event_category->pivot->content_category_id
            ]);
        }

        //ensure the data is in the pivot tables for tags
        foreach ($event->event_topics AS $event_topics){
            $this->assertDatabaseHas('content_tag_event', [
                'event_id' => $event_topics->pivot->event_id,
                'content_tag_id' => $event_topics->pivot->content_tag_id
            ]);
        }

        //make sure the title appears on the group list
        $this->get('/admin/events')->assertSee($attributes['event_name']);
    }

    public function test_admin_can_edit_event_and_view_in_event_list()
    {
        //login as admin
        $admin = $this->signInAsAdmin();

        $attributes = [
            'event_name' => $this->faker->name,
            'event_description' => $this->faker->paragraph,
            'event_start_date_time' => $this->faker->date('Y-m-d H:i:s'),
            'event_end_date_time' => $this->faker->date('Y-m-d H:i:s'),
            'organisation_name' => $this->faker->company,
            'location' => $this->faker->address,
            'contact_name' => $this->faker->name,
            'contact_phone' => $this->faker->phoneNumber,
            'contact_email' => $this->faker->email,
            'contact_link' => $this->faker->url,
            'venue' => $this->faker->address,
            'event_categories' => [1,2],
            'event_topics' => [2,3]
        ];

        //create new event
        $this->post('/admin/events', $attributes);

        //retrieve event from database
        $event = Event::with('event_categories', 'event_topics')->find(1);

        $attributes_edit = [
            'event_name' => $this->faker->name,
            'event_description' => $this->faker->paragraph,
            'event_start_date_time' => $this->faker->date('Y-m-d H:i:s'),
            'event_end_date_time' => $this->faker->date('Y-m-d H:i:s'),
            'organisation_name' => $this->faker->company,
            'location' => $this->faker->address,
            'contact_name' => $this->faker->name,
            'contact_phone' => $this->faker->phoneNumber,
            'contact_email' => $this->faker->email,
            'contact_link' => $this->faker->url,
            'venue' => $this->faker->address,
            'event_categories' => [3,2],
            'event_topics' => [2,1]
        ];

        //update event
        $this->put($event->path(), $attributes_edit);

        //retrieve event from database
        $event = Event::with('event_categories', 'event_topics')->find(1);

        //ensure the event data is in the database
        $this->assertDatabaseHas('events', [
            'event_name' => $attributes_edit['event_name'],
            'location' => $attributes_edit['location']
        ]);

        //ensure the data is in the pivot tables for categories
        foreach ($event->event_categories AS $event_category){
            $this->assertDatabaseHas('content_category_event', [
                'event_id' => $event_category->pivot->event_id,
                'content_category_id' => $event_category->pivot->content_category_id
            ]);
        }

        //ensure the data is in the pivot tables for tags
        foreach ($event->event_topics AS $event_topics){
            $this->assertDatabaseHas('content_tag_event', [
                'event_id' => $event_topics->pivot->event_id,
                'content_tag_id' => $event_topics->pivot->content_tag_id
            ]);
        }

        //make sure the title appears on the group list
        $this->get('/admin/events')->assertSee($attributes_edit['event_name']);
    }

    public function test_admin_can_soft_delete_event_and_does_not_appear_on_event_list()
    {
        //login as admin
        $admin = $this->signInAsAdmin();

        $attributes = [
            'event_name' => $this->faker->name,
            'event_description' => $this->faker->paragraph,
            'event_start_date_time' => $this->faker->date('Y-m-d H:i:s'),
            'event_end_date_time' => $this->faker->date('Y-m-d H:i:s'),
            'organisation_name' => $this->faker->company,
            'location' => $this->faker->address,
            'contact_name' => $this->faker->name,
            'contact_phone' => $this->faker->phoneNumber,
            'contact_email' => $this->faker->email,
            'contact_link' => $this->faker->url,
            'venue' => $this->faker->address,
            'event_categories' => [1,2],
            'event_topics' => [2,3]
        ];

        //create new event
        $this->post('/admin/events', $attributes);
        $event = Event::with('event_categories', 'event_topics')->find(1);

        $this->delete($event->path());

        //check the record has been soft deleted
        $this->assertSoftDeleted('events', ['event_name' => $attributes['event_name']]);

        //make sure the event name does not appear in event list
        $this->get('/admin/users')->assertDontSee($attributes['event_name']);

    }

}

编辑

进一步更新 dd($this->post('/admin/events', $attributes)) 我收到以下错误:

exception: Illuminate\Session\TokenMismatchException^ {#3806
      #message: "CSRF token mismatch."
      #code: 0
      #file: "./vendor/laravel/framework/src/Illuminate/Foundation/Http/Middleware/VerifyCsrfToken.php"
      #line: 83
      trace: {

如何在测试期间通过令牌?

任何帮助将不胜感激

问候 丹尼

【问题讨论】:

    标签: php laravel unit-testing object jenkins


    【解决方案1】:

    我从下面的帖子中找到了解决这个问题的方法

    TokenMismatchException in Laravel's auth form

    【讨论】:

      猜你喜欢
      • 2016-05-22
      • 2018-03-10
      • 1970-01-01
      • 2013-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-25
      相关资源
      最近更新 更多