2
0

TestCase.php 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. <?php
  2. namespace Tests;
  3. use App\Facades\RedisCache;
  4. use Illuminate\Foundation\Testing\TestCase as BaseTestCase;
  5. abstract class TestCase extends BaseTestCase
  6. {
  7. /**
  8. * 测试环境变量:与 phpunit.xml 的 <env> 保持一致。
  9. *
  10. * 必须在这里(Laravel bootstrap 之前)把这些值同时写入 putenv / $_ENV / $_SERVER。
  11. * 原因:Laravel 的 Env::get() 通过 Dotenv 的多 adapter 仓库读取,优先级是
  12. * $_SERVER > $_ENV > getenv;而 PHPUnit 的 <env> 只写 putenv 与 $_ENV、不写 $_SERVER,
  13. * 导致 .env 里的 DB_DATABASE(wikipali)在 $_SERVER 里胜出,测试会连到开发库,
  14. * RefreshDatabase 的 migrate:fresh 会直接清空开发库数据。
  15. *
  16. * @var array<string, string>
  17. */
  18. private const TEST_ENV = [
  19. 'APP_ENV' => 'testing',
  20. 'APP_MAINTENANCE_DRIVER' => 'file',
  21. 'BCRYPT_ROUNDS' => '4',
  22. 'BROADCAST_CONNECTION' => 'null',
  23. 'CACHE_STORE' => 'array',
  24. 'DB_CONNECTION' => 'pgsql',
  25. 'DB_DATABASE' => 'mint_test',
  26. 'DB_URL' => '',
  27. 'MAIL_MAILER' => 'array',
  28. 'QUEUE_CONNECTION' => 'sync',
  29. 'SESSION_DRIVER' => 'array',
  30. 'PULSE_ENABLED' => 'false',
  31. 'TELESCOPE_ENABLED' => 'false',
  32. 'NIGHTWATCH_ENABLED' => 'false',
  33. ];
  34. public function createApplication()
  35. {
  36. foreach (self::TEST_ENV as $key => $value) {
  37. putenv("{$key}={$value}");
  38. $_ENV[$key] = $value;
  39. $_SERVER[$key] = $value;
  40. }
  41. return parent::createApplication();
  42. }
  43. /**
  44. * RedisCache 默认换成内存实现,相当于原来 CACHE_STORE=array 的作用:
  45. * 测试不碰开发 Redis,CI 也不需要起 Redis。
  46. */
  47. protected function setUp(): void
  48. {
  49. parent::setUp();
  50. RedisCache::fake();
  51. }
  52. }