工厂在测试中计算 2 个模型而不是 1 个
Factory counts 2 models instead of 1 in tests
我有这些迁移:
class CreateOrdersTable extends Migration
{
public function up()
{
Schema::create('orders', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users');
});
}
}
class CreatePaymentsTable extends Migration
{
public function up()
{
Schema::create('payments', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('order_id');
$table->timestamps();
$table->foreign('order_id')->references('id')->on('orders');
});
}
}
还有这些工厂:
$factory->define(Payment::class, function (Faker $faker) {
return [
'order_id' => factory(Order::class)->create(),
];
});
$factory->define(Order::class, function (Faker $faker) {
return [
'user_id' => factory(User::class)->create(),
];
});
现在在我的测试中我有这个:
/** @test */
public function it_should_count_1_order()
{
$order = factory(Order::class)->create();
$payment = factory(Payment::class)->create([
'order_id' => $order->id,
]);
$this->assertEquals(1, Order::count())
}
订单 table 计数给了我 2
。为什么?它应该是 1
因为我告诉支付工厂用给定的订单覆盖 order_id
。我错过了什么吗?
由于您的 Payment factory
正在创建一个 Order
,因此您不需要先创建一个 Order
并将其传递给 Payment factory
。
/** @test */
public function it_should_count_1_order()
{
$payment = factory(Payment::class)->create();
$this->assertEquals(1, Order::count())
}
您应该尝试这样定义您的工厂:
$factory->define(Order::class, function (Faker $faker) {
return [
'user_id' => factory(User::class),
});
如果没有帮助,请确保在测试中使用 DatabaseTransactions
或 DatabseMigrations
测试,并在第一次 运行ning 测试之前清除数据库。否则,每次 运行 测试时,数据库中的记录都会越来越多。
就个人而言,我认为使用这样的断言:
$this->assertEquals(1, Order::count())
在测试中不是一个好主意。当您创建更高级的测试时,您可能决定创建一些其他附加数据,您不应该关心之前创建的模型。我个人希望这样的测试:
$initialOrdersCount = Order::count();
// here you run some actions you want to test
$this->assertSame($initialOrdersCount + 1, Order::count());
这样,万一应用程序中发生任何其他事情或将被添加到测试中,我不关心数据库中是否有 2 个或 3 个模型。对我来说重要的是数量或订单应该增加一个。
我有这些迁移:
class CreateOrdersTable extends Migration
{
public function up()
{
Schema::create('orders', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('user_id');
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users');
});
}
}
class CreatePaymentsTable extends Migration
{
public function up()
{
Schema::create('payments', function (Blueprint $table) {
$table->bigIncrements('id');
$table->unsignedBigInteger('order_id');
$table->timestamps();
$table->foreign('order_id')->references('id')->on('orders');
});
}
}
还有这些工厂:
$factory->define(Payment::class, function (Faker $faker) {
return [
'order_id' => factory(Order::class)->create(),
];
});
$factory->define(Order::class, function (Faker $faker) {
return [
'user_id' => factory(User::class)->create(),
];
});
现在在我的测试中我有这个:
/** @test */
public function it_should_count_1_order()
{
$order = factory(Order::class)->create();
$payment = factory(Payment::class)->create([
'order_id' => $order->id,
]);
$this->assertEquals(1, Order::count())
}
订单 table 计数给了我 2
。为什么?它应该是 1
因为我告诉支付工厂用给定的订单覆盖 order_id
。我错过了什么吗?
由于您的 Payment factory
正在创建一个 Order
,因此您不需要先创建一个 Order
并将其传递给 Payment factory
。
/** @test */
public function it_should_count_1_order()
{
$payment = factory(Payment::class)->create();
$this->assertEquals(1, Order::count())
}
您应该尝试这样定义您的工厂:
$factory->define(Order::class, function (Faker $faker) {
return [
'user_id' => factory(User::class),
});
如果没有帮助,请确保在测试中使用 DatabaseTransactions
或 DatabseMigrations
测试,并在第一次 运行ning 测试之前清除数据库。否则,每次 运行 测试时,数据库中的记录都会越来越多。
就个人而言,我认为使用这样的断言:
$this->assertEquals(1, Order::count())
在测试中不是一个好主意。当您创建更高级的测试时,您可能决定创建一些其他附加数据,您不应该关心之前创建的模型。我个人希望这样的测试:
$initialOrdersCount = Order::count();
// here you run some actions you want to test
$this->assertSame($initialOrdersCount + 1, Order::count());
这样,万一应用程序中发生任何其他事情或将被添加到测试中,我不关心数据库中是否有 2 个或 3 个模型。对我来说重要的是数量或订单应该增加一个。