rspec 测试使用 rails 应用程序数据库中整个 table 的虚拟数据

rspec test that uses dummy data from an entire table in rails app database

我想编写一个 rspec 测试,它使用 MyModel.all(即模型的所有记录)并用它做一些事情,returns 结果

是否可以从 rspec 中生成新数据库 table(即模型)?然后在测试结束时销毁它?这被认为是好的做法吗(理论上,如果从事该项目的开发人员巧合地制作了同名的 table 并且它可能会被测试丢弃)。还是这被认为不太可能在测试中生成随机命名的 table?

注意:测试必须提取模型中的所有记录,因此最好在测试中简单地生成一个(非常小的一个),而不是使用实际的 table,它可能很大并且不必要地减慢测试速度

我尝试测试的方法是

def my_method(model_name)
  the_table = eval(model_name).all

  # does some things

end

该方法的主要特点是它接受模型名称(并检索该模型方法中的所有记录)

测试按照

it "ensures something" do

  # tests

  expect(result).to eq(true)

end

这是一个简单的解决方案

Rails 自动创建一个与 dev/prod 具有相同架构的测试数据库。所以你需要做的就是在 运行 你的测试

之前添加一些数据

例如

# Add some records 
@model_name = Model_name.new(name: "John", email: "john@gmail.com")
@model_name.save

# run your test
it "ensures something" do

  # tests

  expect(result).to eq(true)

end

另请注意:

  • 你的 rspec 测试将使用测试数据库,它与你的开发数据库的结构完全相同,但它开始时是空的(因此你必须向它添加一些数据)
  • 您可以非常轻松地将数据放入测试数据库,就像您将数据放入开发(或生产)数据库中一样
  • 请注意,您在 spec.rb 文件中对测试数据库所做的任何操作都将在测试完成后回滚