将Sinatra app的测试数据库与开发数据库分开?

Jef*_* K. 5 rspec datamapper sinatra

作为一个学习练习,我正在使用Sinatra,Datamapper和RSpec构建练习应用程序.我正在使用这个模板,它基本上是上述所有的样板.

我遇到的问题是RSpec和Datamapper似乎配置的方式,每次运行测试数据库相关功能的规范时,这些测试直接更改我的开发数据库而不是测试数据库.

例如,我希望在运行其余规范之前创建一些数据库对象...

before(:all) {
  Region.new(:country => "Canada", :country_code => "CA").save
  ProductLine.new(:reference => "Molders").save
  Product.new(:name => "The Black Molder").save
  Cart.new(:price => 25.95).save
}
Run Code Online (Sandbox Code Playgroud)

然而,每次运行RSpec时,上述元素都会添加到我的开发数据库中.

为什么不生成测试数据库呢?如何让测试数据库正常工作?

除了Sinatra而不是Rails之外,这看起来与此问题非常类似.

如果有任何帮助,我的代码可以在这里看到.

mat*_*att 16

spec_helper.rb文件中,您需要my_app.rb文件,而这又需要db.rb设置您的数据库,但这会您调用之前发生set :environment, :test,因此该configure :test块未运行(该环境是该阶段的默认开发).

当然,set environment :test在您需要Sinatra之前无法调用,但您可以设置RACK_ENV环境变量,Sinatra在设置其环境时会检查该变量.

因此,为了确保您在测试环境中运行,请将其添加到spec_helper.rb测试开始时(或在您需要Sinatra之前)的顶部(或其他位置):

ENV['RACK_ENV'] = 'test'
Run Code Online (Sandbox Code Playgroud)

然后你可以删除该set :environment, :test行,因为它现在是冗余的.

这与您引用的其他问题类似,但机架应用程序使用RACK_ENV而不是RAILS_ENV.

  • 谢谢,我将 `ENV['RACK_ENV'] = 'test'` 放在了不同的地方,并且对它为什么没有被选中感到沮丧 - 在阅读你的回答后,我把它放在了 `spec_helper.rb` 的顶部**之前**`需要'sinatra'`,现在它可以工作了! (2认同)