【发布时间】: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