ruby Rspec:如何验证一条记录是否已被删除?

mlmc2os5  于 2023-04-20  发布在  Ruby
关注(0)|答案(3)|浏览(126)

我创建了一个简单的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
2mbi3lxu

2mbi3lxu1#

你有两个选择。你可以测试一下:
1.从数据库中删除了一条记录

it "removes a record from the database" do
  expect { person.destroy }.to change { Person.count }.by(-1)
end

但这并不能告诉你哪个记录被删除了。
1.或者确切的记录不再存在于数据库中

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
svgewumm

svgewumm2#

我认为下面是一个很好的方法来测试一个特定的记录已经被删除了一个期望,同时确保你测试的结果的行动,而不仅仅是你的测试对象的状态。

it "removes the record from the database" do
  expect { person.destroy }.to change { Person.exists?(person.id) }.to(false)
end
dl5txlt9

dl5txlt93#

当你从数据库中删除一条记录时,一个对象仍然存在于内存中,这就是为什么expect(person).to be_empty()失败的原因。
RSpec有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是一个框架的方法,据我所知,你不需要测试它的方法。

相关问题