rspec测试使用Rails应用程序数据库中整个表的伪数据

时间:2019-02-02 08:53:48

标签: ruby-on-rails ruby rspec ruby-on-rails-5 rspec-rails

我想要写一个RSpec测试使用MyModel.all(即,用于一个模型中的所有记录),并做一些事情与它返回一个结果

是否可以从rspec中生成新的数据库表(即模型)?然后在测试结束摧毁它?这是否被认为是一种好习惯(理论上,如果一个从事该项目的开发人员巧合地制作了一个同名表,并且可能被测试删除)。还是这样认为不太可能,可以在测试中生成随机命名的表?

注意:测试必须提取模型中的所有记录,因此,为什么在测试内部简单地生成一个(很小的)记录而不是使用实际的表会是个不错的选择,其可以是大的并且不必要地减慢测试

我要测试的方法是

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

1 个答案:

答案 0 :(得分:0)

这是一个简单的解决方案

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文件中的测试数据库所做的任何操作都会回滚