> ## 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/packages/laravel-copilot-sdk/index.md)
- [GitHub Actions - GitHub Copilot SDK for Laravel](/zh/packages/laravel-copilot-sdk/github-actions.md)
- [认证 - GitHub Copilot SDK for Laravel](/zh/packages/laravel-copilot-sdk/auth.md)
- [Laravel Cloud - GitHub Copilot SDK for Laravel](/zh/packages/laravel-copilot-sdk/laravel-cloud.md)
- [快速开始 - GitHub Copilot SDK for Laravel](/zh/packages/laravel-copilot-sdk/getting-started.md)
