当同一测试类中的多个测试方法调用Auth :: id()在控制器中为空

时间:2019-05-23 20:30:42

标签: php laravel phpunit

使用Laravel 5.4和spatie/laravel-permission

Auth :: id()由多个测试方法调用时返回null。如果单独调用,则会定义Auth :: id()并按预期运行测试。

这是整个班级:

namespace Tests\Feature;

use App\PartNumber;
use App\SeriesNumber;
use App\Sort;
use App\User;
use App\WorkOrder;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Spatie\Permission\Models\Role;
use Tests\TestCase;

class SeriesNumberTest extends TestCase
{
    use DatabaseMigrations;

    public function setUp()
    {
        parent::setUp();
        $this->app->make(\Spatie\Permission\PermissionRegistrar::class)->registerPermissions();
    }

    /** @test */
    public function user_without_access_to_work_order_should_not_delete_series_number()
    {
        // create user
        $user = factory(User::class)->create();
        $role = Role::create(['name' => 'shift_supervisor']);
        $user->assignRole($role);

        // create work order, part_number, series number
        $work_order = factory(WorkOrder::class)->create([
            'client_id' => 1,
        ]);

        $part_number = factory(PartNumber::class)->make();
        $work_order->part_numbers()->save($part_number);
        $series_number = factory(SeriesNumber::class)->make([
            'number' => 'sample text'
        ]);

        $part_number->series_numbers()->save($series_number);

        // assign user to work_order
        $user->work_orders()->save($work_order);

        // test
        $this->actingAs($user)->get('/series-numbers/destroy/'.$series_number->id);

        $this->assertDatabaseMissing('series_numbers', [
            'number' => 'sample text'
        ]);
    }

    /** @test */
    public function user_without_access_to_work_order_cant_create()
    {
        $user = factory(User::class)->create();
        $role = Role::create(['name' => 's
        hift_supervisor']);
        $user->assignRole($role);
        $work_order = factory(WorkOrder::class)->create([
            'client_id' => 1,
        ]);

        $user->work_orders()->save($work_order);
        $part_number = factory(PartNumber::class)->create([
            'work_order_id' => $work_order->id
        ]);

        $sort = factory(Sort::class)->create([
            'work_order_id' => $work_order->id,
            'site_id' => 1,
            'measuring_unit_id' => 1,
        ]);

        $series_number = factory(SeriesNumber::class)->raw([
            'number' => 'sample text',
            'part_number_id' => $part_number->id,
            'sort_id' => $sort->id,
            'mfg_date' => '2019-05-28 00:00:00.0'
            //  need to override factory because phpunit complains about array to string conv
        ]);

        $response = $this->actingAs($user)
            ->json('POST', '/series-numbers/create', $series_number);

        $this->assertDatabaseHas('series_numbers', [
            'number' => 'sample text'
        ]);
    }
}

我有2种测试方法:

user_without_access_to_work_order_cant_create()

和:

user_without_access_to_work_order_should_not_delete_series_number()

如果我禁用其中一个,则另一个将向我的控制器传递一个已定义的经过身份验证的用户。如果我同时运行第二个被调用的函数,则会返回以下错误:

1) Tests\Feature\SeriesNumberTest::user_without_access_to_work_order_should_not_delete_series_number

Illuminate \ Database \ Eloquent \ ModelNotFoundException:没有针对模型[App \ User]的查询结果

两种方法中都以相同的方式创建用户并为其分配角色。我不明白为什么在调用第二种方法时它们的行为有所不同。

0 个答案:

没有答案