Codeception / Codeception/module-doctrine

[Doctrine] ManyToMany Relationships not persisted in database with haveInRepository nested entity creation

Đang mở
#16 7 bình luận 1 reaction 0 người được giao Xem trên GitHub
Ngôn ngữ chính
PHP
Star
4
Fork
2
Chỉ số merge pull request
Không có pull request nào được merge trong 30 ngày

Mô tả

#### What are you trying to achieve?

I am running a functional test on a Symfony 4 + Doctrine 2 with two entities with a ManyToMany relationship. I create the entities using haveInRepository nested functionality and I expect to have the two entities created on the database and related on the join table.

#### What do you get instead?

The entities are created but relationships in join tables are not, so the test fails due to missing information on database.

> Provide console output if related. Use `-vvv` mode for more details.

```bash
vagrant@symfonyvm:/var/www/mtm$ php vendor/bin/codecept run
Codeception PHP Testing Framework v3.1.2
Powered by PHPUnit 8.5.0 by Sebastian Bergmann and contributors.
Running with seed:

App\Tests.acceptance Tests (0) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

App\Tests.functional Tests (1) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Testing App\Tests.functional
✖ ManytoManyEntitiesCest: Try to test (0.07s)
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

App\Tests.unit Tests (0) ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Time: 326 ms, Memory: 28.25 MB

There was 1 failure:

---------
1) ManytoManyEntitiesCest: Try to test
Test tests/functional/ManytoManyEntitiesCest.php:tryToTest
Step See in repository "App\Entity\EntityA",{"entityB":{"name":"Name B"}}
Fail App\Entity\EntityA with {"entityB":{"name":"Name B"}}
Failed asserting that false is true.

Scenario Steps:

4. $I->seeInRepository("App\Entity\EntityA",{"entityB":{"name":"Name B"}}) at tests/functional/ManytoManyEntitiesCest.php:24
3. $I->seeInRepository("App\Entity\EntityA",{"name":"Name A"}) at tests/functional/ManytoManyEntitiesCest.php:23
2. $I->seeInRepository("App\Entity\EntityB",{"name":"Name B"}) at tests/functional/ManytoManyEntitiesCest.php:22
1. $I->haveInRepository("App\Entity\EntityA",{"name":"Name A","entityB":[{"name":"Name B"}]}) at tests/functional/ManytoManyEntitiesCest.php:19

FAILURES!
Tests: 1, Assertions: 3, Failures: 1.
```
> Provide test source code if related

```php
haveInRepository(
EntityA::class,
[
'name' => 'Name A',
'entityB' =>[[ 'name' => 'Name B' ]],
]);
$I->seeInRepository(EntityB::class, ['name' => 'Name B']);
$I->seeInRepository(EntityA::class, ['name' => 'Name A']);
$I->seeInRepository(EntityA::class, ['entityB' => ['name' => 'Name B']]);
}
```
### Details

With that setup, the two first seeInRepository pass but the third does not. It could be due to the syntax of the array not being correct on the last assertion as it should really be an array, but if you look into the database you can see that the join table has not been filled.

It may be due a syntax problem, but in that case it should be an issue with docs as it doesn't specify how to work with ManyToMany relationships.

I have created a complete example in this repo: https://github.com/Pryrios/test-manytomany

* Codeception version: Codeception PHP Testing Framework v3.1.2
* PHP Version: 7.2
* Operating System: Ubuntu 18.04
* Installation type: Composer

functional.suite.yml
```yml
actor: FunctionalTester
modules:
enabled:
- Symfony:
app_path: 'src'
environment: 'test'
- Doctrine2:
depends: Symfony
cleanup: true
- \App\Tests\Helper\Functional
```

Hướng dẫn đóng góp

Chưa lập chỉ mục được hướng dẫn đóng góp cho kho mã nguồn này

Hướng nghiên cứu

Bắt đầu với tests/functional/ManytoManyEntitiesCest.php và cấu hình Doctrine2 trong functional.suite.yml, sau đó theo dõi cách haveInRepository xử lý dữ liệu entityB lồng nhau. Xác minh ánh xạ ManyToMany dự kiến và cú pháp assertion dựa trên trạng thái cơ sở dữ liệu được báo cáo. Hoàn tất khi các entity được tạo, bảng join chứa mối quan hệ và assertion seeInRepository cuối cùng vượt qua.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
php
Lĩnh vực
database, testing
Loại issue
Lỗi
Độ khó
3/5
Thời gian dự kiến
1-2 ngày
Mức độ hoạt động
Đình trệ
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
35/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.