Rspec: 如何验证记录是否被删除?
Rspec: How to verify if a record has been deleted?
我创建了一个简单的 Rspec 测试来验证创建的模型是否已被删除。但是,测试失败,因为模型仍然存在。任何人都可以提供有关如何确定记录是否实际删除的任何帮助吗?
RSpec.describe Person, type: :model do
let(:person) {
Person.create(
name: "Adam",
serial_number: "1"
)
}
it "destroys associated relationships when person destroyed" do
person.destroy
expect(person).to be_empty()
end
end
当您从数据库中删除一条记录时,一个对象仍然存在于内存中。这就是 expect(person).to be_empty()
失败的原因。
RSpec 有 change
matcher. ActiveRecord has the persisted?
方法。如果记录未保存在数据库中,则 returns 为 false。
it "destroys associated relationships when rtu destroyed" do
expect { person.destroy }.to change(Person, :count).by(-1)
expect(person.persisted?).to be_falsey
end
destroy
是一个框架的方法。据我所知,你不需要测试它的方法。
你有两个选择。你可以测试一下
一条记录已从数据库中删除
it "removes a record from the database" do
expect { person.destroy }.to change { Person.count }.by(-1)
end
但这并没有告诉您删除了哪条记录。
或者数据库中不再存在确切的记录
it "removes the record from the database" do
person.destroy
expect { person.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
或
it "removes the record from the database" do
person.destroy
expect(Person.exists?(person.id)).to be false
end
但这并不能确保该记录之前存在。
两者的组合可能是:
it "removes a record from the database" do
expect { person.destroy }.to change { Person.count }.by(-1)
expect { person.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
我认为以下是一种很好的方法来测试特定记录已被删除,同时确保您测试的是操作的结果,而不仅仅是测试对象的状态。
it "removes the record from the database" do
expect { person.destroy }.to change { Person.exists?(person.id) }.to(false)
end
我创建了一个简单的 Rspec 测试来验证创建的模型是否已被删除。但是,测试失败,因为模型仍然存在。任何人都可以提供有关如何确定记录是否实际删除的任何帮助吗?
RSpec.describe Person, type: :model do
let(:person) {
Person.create(
name: "Adam",
serial_number: "1"
)
}
it "destroys associated relationships when person destroyed" do
person.destroy
expect(person).to be_empty()
end
end
当您从数据库中删除一条记录时,一个对象仍然存在于内存中。这就是 expect(person).to be_empty()
失败的原因。
RSpec 有 change
matcher. ActiveRecord has the persisted?
方法。如果记录未保存在数据库中,则 returns 为 false。
it "destroys associated relationships when rtu destroyed" do
expect { person.destroy }.to change(Person, :count).by(-1)
expect(person.persisted?).to be_falsey
end
destroy
是一个框架的方法。据我所知,你不需要测试它的方法。
你有两个选择。你可以测试一下
一条记录已从数据库中删除
it "removes a record from the database" do expect { person.destroy }.to change { Person.count }.by(-1) end
但这并没有告诉您删除了哪条记录。
或者数据库中不再存在确切的记录
it "removes the record from the database" do person.destroy expect { person.reload }.to raise_error(ActiveRecord::RecordNotFound) end
或
it "removes the record from the database" do person.destroy expect(Person.exists?(person.id)).to be false end
但这并不能确保该记录之前存在。
两者的组合可能是:
it "removes a record from the database" do
expect { person.destroy }.to change { Person.count }.by(-1)
expect { person.reload }.to raise_error(ActiveRecord::RecordNotFound)
end
我认为以下是一种很好的方法来测试特定记录已被删除,同时确保您测试的是操作的结果,而不仅仅是测试对象的状态。
it "removes the record from the database" do
expect { person.destroy }.to change { Person.exists?(person.id) }.to(false)
end