php - PHPUnit - 具有多种插入方法时,AssertCount 失败
问题描述
嘿,我刚开始使用 PHPUnit。我正在尝试测试将模型(称为Actor)插入数据库。该模型的创建导致创建其他模型(如Subactor和Contact)。出于这个原因,我已经单独测试了每个模型的创建。
问题是当我尝试单独运行每个测试时,一切正常。但是,当我尝试运行全班测试时。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);
}
}
解决方案
您正在测试的代码广泛使用全局状态(通过静态方法),这就是您的测试相互干扰的原因。为了避免在每个方法中重置状态,您可以使用带有@before
注释的方法或覆盖setUp()
测试用例类的 nethod - 这些代码将在每个测试方法之前执行。
推荐阅读
- javascript - Internet Explorer Javascript 语法错误
- ios - 音频无法正常播放
- kinvey - 如何使用 flex 服务将文件上传到 kinvey?
- jquery - 弹出文字编辑
- mount - 使用 secretfile 挂载 cephfs
- algorithm - 在二叉堆中查找特定元素?
- python-3.x - Tkinter get() 无法正常工作
- android - 当应用程序被杀死时,FireBase 仅在低于 android 6.0 的设备中没有收到推送通知
- go - 如何使用 Kalax 编写连接查询
- facebook - 找出谁或什么在使用 API 调用?