簡體   English   中英

Symfony PHPunit 測試 - 我如何模擬服務?

[英]Symfony PHPunit Testing - how do I mock services?

我只是想知道您如何在 Symfony 中模擬服務。

到目前為止,這就是我最終得到的結果,它沒有按預期工作。 我希望 NetballFeedService 中的getVenuesData()方法在測試中轉儲NetballFeedService數據(我在命令中設置了 DD)。 但是當我運行測試時,它會轉儲從NetballFeedService中提取的實時數據。

測試:

    public function it_imports_venues(): void
    {
        $kernel = self::bootKernel();

        $netballAPIMock = $this->createMock(NetballFeedService::class);
        $netballAPIMock->method('getVenuesData')->willReturn([
            800 => ['name' => 'Venue 1', 'location' => 'MEL'],
            801 => ['name' => 'Venue 2', 'location' => 'ADE']
        ]);

        $this->getContainer()->set('netballAPI', $netballAPIMock);

        $container = $kernel->getContainer();
        $container->set('netballAPI', $netballAPIMock);

        $application = new Application($kernel);

        $command = $application->find('app:feed:import-venues');
        $commandTester = new CommandTester($command);
        $commandTester->execute([]);
        $commandTester->assertCommandIsSuccessful();
    }

正在測試的命令:

    protected static $defaultName = 'app:feed:import-venues';

    public function __construct(
        private readonly NetballFeedService $netballFeedService,
        private readonly VenueService $venueService
    )
    {
        parent::__construct();
    }

    protected function execute(InputInterface $input, OutputInterface $output): int
    {
        $data = $this->netballFeedService->getVenuesData();
        dd($data);
        $this->venueService->updateVenuesDataFromFeed($data);

        return 0;
    }

Class 方法預期返回模擬數據:

    public function getVenuesData(): array
    {
        $response = $this->client->request('GET', self::FIXTURES_URL);
        $rawData = json_decode($response->getBody()->getContents(), true);
        $rounds = $rawData['data']['results'];

        $parsedVenuesData = [];
        foreach ($rounds as $round) {
            foreach ($round['matches'] as $matches) {
                $venueId = $matches['venueId'];

                if (array_key_exists($venueId, $matches)) {
                    continue;
                }

                $parsedVenuesData[$matches['venueId']] = [
                    'name' => $matches['venueName'],
                    'location' => $matches['venueLocation']
                ];
            }
        }

        ksort($parsedVenuesData);

        return $parsedVenuesData;
    }

我正在嘗試在 Symfony 中復制我的 Laravel 測試代碼:

/** @test */
    public function it_imports_venues()
    {
        $this->withExceptionHandling();

        $this->instance(
            NetballAPI::class,
            Mockery::mock(NetballAPI::class, function (MockInterface $mock) {
                $mock->shouldReceive('getVenuesData')->once()
                    ->andReturn([
                        800 => [
                            'name' => 'Venue 1',
                            'location' => 'MEL'
                        ],
                        801 => [
                            'name' => 'Venue 2',
                            'location' => 'ADE'
                        ],
                    ]);
            })
        );

        $this->artisan('import:venues');

        $this->assertDatabaseHas('venues', [
            'id' => 800,
            'name' => 'Venue 1',
            'location' => 'MEL'
        ]);

        $this->assertDatabaseHas('venues', [
            'id' => 801,
            'name' => 'Venue 2',
            'location' => 'ADE'
        ]);

services_test.yml

services:
  _defaults:
    public: true

  App\Service\NetballFeedService:
    public: true
    alias: netballAPI

只是想知道如何在測試實例中模擬NetballFeedService class ? 提前致謝。

我正在配置service_test.yaml錯誤。 它應該是:

services:
  App\Service\NetballFeedService:
    public: true

  app.netballFeedService:
    alias: App\Service\NetballFeedService
    public: true

另外,我不太習慣使用 YAML 文件進行配置。 在這種情況下,特別是與它的 PHP 文件對應物相比,它的可讀性不是很好。 所以我將嘗試使用 YAML 和 PHP 文件進行配置/路由等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM