我可以将此功能测试更改为单元测试吗?

问题描述 投票:0回答:1

我编写了两个测试:一个向端点发出发布请求并等待包含状态和消息的特定响应;另一个向端点发出请求并等待包含状态和消息的特定响应。另一个发出完全相同的请求,但它不是等待响应,而是验证数据库是否具有与我刚刚发送的数据相匹配的数据。这两个测试都是功能测试,到目前为止我的应用程序中还没有单元测试;发生这种情况是因为我只测试了端点。

所以我的想法如下:我可以直接测试为数据库创建新寄存器的服务方法,而不是在第二个测试中调用端点。这是有效的单元测试吗?

就我个人而言,我认为这是有效的,因为我正在隔离特定的方法并测试代码是否有效,而不是测试集成是否有效,即使我的代码与数据库(Eloquent)集成,我的服务方法是最接近的我系统中的数据库是可测试的。

我的两个测试,按照我上面指定的顺序:

/** @test */
  public function a_group_can_be_created()
  {
    $this->withoutExceptionHandling()->signIn();

    $group_data = [
      'name' => $this->faker->word(),
      'status' => $this->faker->boolean(),
    ];
    $modules = ['modules' => Modules::factory(1)->create()->pluck('id')];

    $response = $this->post(route('cms.groups.store'), array_merge($group_data, $modules));

    $response->assertSessionHas('response', cms_response(trans('cms.groups.success_create')));
  }

  /** @test */
  public function creating_a_group_persists_its_data_to_the_database()
  {
    $this->withoutExceptionHandling()->signIn();

    $group_data = [
      'name' => $this->faker->word(),
      'status' => $this->faker->boolean(),
    ];
    $modules = ['modules' => Modules::factory(1)->create()->pluck('id')];

    $this->post(route('cms.groups.store'), array_merge($group_data, $modules));

    $this->assertDatabaseHas('groups', $group_data);
    $this->assertDatabaseCount('modules', 2);
    $this->assertDatabaseCount('group_modules', 2);
  }
php laravel unit-testing eloquent integration-testing
1个回答
1
投票

laravel 中的单元测试“不启动您的 Laravel 应用程序,因此无法访问应用程序的数据库或其他框架服务”

话虽如此,您无法使用外观或雄辩的模型访问任何数据库

因此,如果你将功能测试更改为单元测试,它将失败。

如果您不使用任何 Laravel 框架实用程序,单元测试将运行良好。我偶尔用它来测试一些自制的库

但是,如果您想隔离它并创建功能测试而不调用 API 端点,它也可以工作。这实际上取决于您来决定是否有必要这样做。但请记住,不必要的测试会使测试时间更长,特别是当您使用 RefreshDatabase 或 DatabaseMigration 特征时。等他们完成会很烦人

© www.soinside.com 2019 - 2024. All rights reserved.