Несовместимые данные, связанные с принадлежащим - PullRequest
0 голосов
/ 13 марта 2020

Я создаю функциональный тест для отношений один ко многим. Я просто имею отношение один ко многим с правильной базой настройки в документации Laravel. Мой тест проходит следующим образом.

   /** @test */
    public function it_attach_containers()
    {
        $this->withoutExceptionHandling();

        $vendor = factory(Vendor::class)->create();

        $containersCount = 30;
        $containers = factory(Container::class, $containersCount)->create();

        $user = factory(User::class)->create();

        $attributes = [
            'vendor' => $vendor->id,
            'ordered' => null,
            'deployed' => null,
            'last_contact' => null,
            'containers' => $containers->pluck('name')
        ];

        $response = $this->actingAs($user, 'api')
            ->withHeaders([
                'X-Requested-With' => 'XMLHttpRequest'
            ])
            ->json('POST', '/api/deployments', $attributes);

        $deployment = Deployment::find($containers[0]->id);

        $this->assertInstanceOf(Deployment::class, $deployment);

        $this->assertCount($containersCount, $deployment->containers()->get());

        $this->assertDatabaseHas('deployments', [
            'vendor' => $vendor->id,
            'ordered' => null,
            'deployed' => null,
            'last_contact' => null
        ]); 
    }

Отношение, которое я имею, является отношением один ко многим. Одно развертывание имеет много контейнеров. Приведенный ниже код показывает, как я связываю отношения.


    public function associateDeployment(Deployment $deployment, $data)
    {
        foreach ($data['containers'] as $containerName) {
            $container = Container::where('name', $containerName)->first();
            if (!$container) {
                $container = Container::create([
                    'name' => $containerName,
                    'status' => true
                ]);
            }

            if (is_null($container->deployment_id)) {
                $container->deployment()->associate($deployment);
                $container->save();
            }            
        }
    }

Результат моего теста действительно странный. иногда это проходит, но иногда нет. Я заметил, что проблема возникает на assertCount. как вы можете видеть на моем тесте. он утверждает, что контейнеров 30, но в основном он не go до 30. его около 25-29 .. тогда иногда он проходит. в чем проблема?

1 Ответ

0 голосов
/ 13 марта 2020

Я думаю, что ошибка заключается в следующей строке:

$deployment = Deployment::find($containers[0]->id);

Здесь вы выбираете запись развертывания, используя идентификатор контейнера. Вместо этого используйте следующий код:

$deployment = Deployment::find($containers[0]->deployment_id);
...