首页 > 解决方案 > 集成或单元测试

问题描述

我不太清楚何时应该使用集成和单元测试

如果我想在不发出任何 http 请求的情况下测试以下代码,我应该使用集成测试还是单元?

创建线程时,会记录活动并触发电子邮件事件

ThreadObserver extends Observer
{
    public function created(Thread $thread)
    {
        Activity::record($thead);
        event(new ThreadWasCreated($thread);
     }
}
class RecordsActivityTest
{
    public function it_records_the_acitivty_when_a_thread_is_created()
    {
        Thread::factory()->create();
        $this->assertDatabaseHas('activities', […]);
   
    }
    

}

另一个例子,我想测试它返回预期结果的查询。

class Search
{
     public function __construct(protected Index $index)
     {
            
      }

      public function handle($query)
      {
            $this->index->search($query);
             // more code 
       }
}
class SearchTest
{
    public function it_returns_the_expected_result()
    {
        $search = new Search(new Index);
        $results = $search->handle(“some query”);
        $this->assertEquals(“some
    Data”);
    }

}


我是否需要单元测试来测试Search类或集成测试,因为它依赖于另一个类?

标签: laravel

解决方案


第一个示例,我很可能会编写一个集成测试,但我不会测试数据库是否有值,而是模拟事件https://laravel.com/docs/8.x/mocking#event- fake并断言事件已被调度。

然而,第二个例子,它可以去任何一种方式。您可以编写一个单元测试并模拟所有内容,或者,您可以编写一个集成测试,以便您可以使用 Laravel 帮助程序,特别是https://laravel.com/docs/8.x/mocking#http-fake如果您“重新测试 API,否则如果您正在测试和 SDK,则为嘲弄。


推荐阅读