我已经创建了一个简单的 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
你有两个选择。你可以测试一下:
一条记录已从数据库中删除
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
当你从数据库中删除一条记录时,一个对象仍然存在于内存中。这就是
expect(person).to be_empty()
失败的原因。
change
匹配器。 ActiveRecord 有 persisted?
方法。如果记录未保存在数据库中,则返回 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
是一个框架的方法。据我所知,你不需要测试它的方法。