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是一个框架的方法。据我所知,你不需要测试它的方法。

你有两个选择。你可以测试一下

  1. 一条记录已从数据库中删除

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

    但这并没有告诉您删除了哪条记录。

  2. 或者数据库中不再存在确切的记录

    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