> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# 測試 - GitHub Copilot SDK for Laravel

> 說明如何在 Laravel Copilot SDK 中使用 Copilot::fake()、斷言、預防 stray request 進行測試。

在 Laravel 中可以撰寫這樣的測試程式碼。

## Copilot::fake()

`Copilot::fake()` 是針對 Copilot Facade 所使用功能的 mock，並不會 mock 其他功能。

```php theme={null}
use Revolution\Copilot\Facades\Copilot;

Copilot::fake('2'); // 一律回傳 '2' 的 mock

$response = Copilot::run(prompt: '1 + 1'); // 此處實際上不會呼叫 Copilot CLI

// Pest
expect($response->content())->toBe('2');
// PHPUnit
$this->assertEquals('2', $response->content());
```

於 `Copilot::start` 中多次呼叫時的用法。

```php theme={null}
use Revolution\Copilot\Facades\Copilot;
use Revolution\Copilot\Contracts\CopilotSession;

Copilot::fake([
    '*' => Copilot::sequence()
            ->push(Copilot::response('2'))
            ->push(Copilot::response('4')),
]);

Copilot::start(function (CopilotSession $session) use (&$response1, &$response2) {
    $response1 = $session->sendAndWait(prompt: '1 + 1'); // 回傳 '2'
    $response2 = $session->sendAndWait(prompt: '2 + 2'); // 回傳 '4'
});

expect($response1->content())->toBe('2');
```

## 斷言

確認特定 prompt 已被呼叫。

```php theme={null}
Copilot::assertPrompt('1 + *');
```

確認 prompt 未被呼叫。

```php theme={null}
Copilot::assertNotPrompt('1 + *');
```

確認 prompt 被呼叫的次數。

```php theme={null}
Copilot::assertPromptCount(3);
```

確認 prompt 完全沒有被呼叫。

```php theme={null}
Copilot::assertNothingSent();
```

## Prevent stray requests

阻止所有 JSON-RPC 請求。若被呼叫會擲出 `Revolution\Copilot\Exceptions\StrayRequestException` 例外。

```php theme={null}
Copilot::preventStrayRequests();
```

若只允許部分指令。

```php theme={null}
Copilot::preventStrayRequests(allow: ['ping']);
```

停止阻止。

```php theme={null}
Copilot::preventStrayRequests(false);
```

阻止的僅為 JSON-RPC 請求，因此不會阻止 `Client::start()`。

## 可能無法正常運作的用法

若在 Artisan 指令內使用 Copilot，`fake()` 的 mock 有效，但之後的 `assertPrompt()` 等有時無法正常運作。因使用範例較少，正在調查中。

```php theme={null}
use Revolution\Copilot\Facades\Copilot;

Copilot::fake('Hello');

$this->artisan('copilot:hi');

Copilot::assertPrompt('Hi');
```

## shouldReceive() / expects()

Mockery 中熟悉的 `shouldReceive()` 或 `expects()` 當然也可以使用。
只要使用 Facade 就會自動支援此功能，故省略說明。

<Info>
  最新資訊請參考 [GitHub 儲存庫](https://github.com/invokable/laravel-copilot-sdk)。
</Info>


## Related topics

- [GitHub Copilot SDK for Laravel](/zh-TW/packages/laravel-copilot-sdk/index.md)
- [GitHub Actions - GitHub Copilot SDK for Laravel](/zh-TW/packages/laravel-copilot-sdk/github-actions.md)
- [認證 - GitHub Copilot SDK for Laravel](/zh-TW/packages/laravel-copilot-sdk/auth.md)
- [Laravel Cloud - GitHub Copilot SDK for Laravel](/zh-TW/packages/laravel-copilot-sdk/laravel-cloud.md)
- [開始使用 - GitHub Copilot SDK for Laravel](/zh-TW/packages/laravel-copilot-sdk/getting-started.md)
