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

问题描述 投票:0回答:3

我已经创建了一个简单的 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
ruby unit-testing rspec ruby-on-rails-5
3个回答
28
投票

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

  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

5
投票

我认为以下是一种很好的方法来测试特定记录已被删除,同时确保您测试操作的结果而不仅仅是测试对象的状态。

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

3
投票

当你从数据库中删除一条记录时,一个对象仍然存在于内存中。这就是

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

© www.soinside.com 2019 - 2024. All rights reserved.