首页 > 解决方案 > PHPUnit - 具有多种插入方法时,AssertCount 失败

问题描述

嘿,我刚开始使用 PHPUnit。我正在尝试测试将模型(称为Actor)插入数据库。该模型的创建导致创建其他模型(如SubactorContact)。出于这个原因,我已经单独测试了每个模型的创建。

问题是当我尝试单独运行每个测试时,一切正常。但是,当我尝试运行全班测试时。AssertCount 方法失败,因为每个方法都添加了一个模型,因此计数会增加,并且在运行整个类测试时数据库不会刷新。

在此处输入图像描述

我尝试在每个方法开始时初始化每个模型的计数,但我认为这不是最好的解决方案。

任何人都可以帮忙吗?

谢谢!

class ActorTest extends TestCase
{
    use WithFaker;
    use RefreshDatabase;

    
    /** @test */
    public function an_actor_can_be_added()
    {
        $user = factory(Admin::class)->create();

        $response = $this->actingAs($user)
        ->post('admin/actor',
        array_merge(factory(Actor::class)->make()->toArray(),
        ['contact'=>[factory(Contact::class)->make()->toArray()]]));
        
        $this->assertCount(1, Actor::all());
    }

    /** @test */
    public function a_subactor_is_added_when_actor_created(){
        $user = factory(Admin::class)->create();

        $this->actingAs($user)
        ->post('admin/actor',
        array_merge(factory(Actor::class)->make()->toArray(),
        ['contact'=>[factory(Contact::class)->make()->toArray()]]));

        $this->assertCount(1, Subactor::all());
    }

    /** @test */
    public function a_contact_is_added_when_actor_created(){
        $user = factory(Admin::class)->create();

        $this->actingAs($user)
        ->post('admin/actor',
        array_merge(factory(Actor::class)->make()->toArray(),
        ['contact'=>[factory(Contact::class)->make()->toArray()]]));

        $this->assertCount(1, Contact::all());
    }

    /** @test */
    public function an_actor_is_linked_to_subactor_when_created(){
        $user = factory(Admin::class)->create();

        $this->actingAs($user)
        ->post('admin/actor',
        array_merge(factory(Actor::class)->make()->toArray(),
        ['contact'=>[factory(Contact::class)->make()->toArray()]]));

        $actor = Actor::first();
        $subactor = Subactor::first();
        
        $this->assertEquals($actor->id, $subactor->actor_id); 
    }

    /** @test */
    public function a_subactor_is_linked_to_contact_when_created(){
        $user = factory(Admin::class)->create();

        $this->actingAs($user)
        ->post('admin/actor',
        array_merge(factory(Actor::class)->make()->toArray(),
        ['contact'=>[factory(Contact::class)->make()->toArray()]]));

        $subactor = Subactor::first();
        $contact = Contact::first();
        
        $this->assertEquals($subactor->id, $contact->subactor_id); 
    }
}

标签: phpdatabaselaravelunit-testingphpunit

解决方案


您正在测试的代码广泛使用全局状态(通过静态方法),这就是您的测试相互干扰的原因。为了避免在每个方法中重置状态,您可以使用带有@before注释的方法或覆盖setUp()测试用例类的 nethod - 这些代码将在每个测试方法之前执行。


推荐阅读