如何使用RSpec 2关闭仅一个规格(或牛排情景)的交易灯具? 我在网上找到了一些没有成功的东西。
这会导致未定义的方法异常。
describe "MyClass without transactional fixtures" do self.use_transactional_fixtures = false ... end
这根本不做任何事情(事务夹具仍在使用):
describe "MyClass without transactional fixtures" do RSpec.configure do |config| config.use_transactional_fixtures = false end ... end
我还能尝试什么?
答案 0 :(得分:29)
我通常会添加一个这样的帮手:
def without_transactional_fixtures(&block)
self.use_transactional_fixtures = false
before(:all) do
DatabaseCleaner.strategy = :truncation
end
yield
after(:all) do
DatabaseCleaner.strategy = :transaction
end
end
这让我可以关闭规范中特定块的事务性灯具:
describe "doing my thing" do
without_transactional_fixtures do
it "does something without transaction fixtures" do
...
end
end
end
答案 1 :(得分:7)
这曾经是一个错误(见ticket #197),但我现在似乎没事。我只是不知道它是否适用于每个测试基础(可能不是)。如果要执行此操作,可以通过将config.use_transactional_fixtures = false
放在spec_helper.rb
上并使用DatabaseCleaner进行设置来全局禁用事务夹具。
我在浏览器上使用javascript测试页面时遇到了类似的问题(这种情况不适用于事务夹具)。以下是我设法解决这个问题的方法:http://github.com/lailsonbm/contact_manager_app
答案 2 :(得分:7)
我已经这样做了,使用database_cleaner,以便测试使用事务的代码(这将与transactional_fixtures冲突或任何其他策略进行事务测试,例如DatabaseCleaner.strategy =:truncation或:transaction):
# spec_helper.rb
config.use_transactional_fixtures = false
config.around(:each, :testing_transactions => true) do |ex|
DatabaseCleaner.strategy = nil
ex.run
DatabaseCleaner.strategy = :truncation
end
在我的测试用例中:
it "should not save if one of objects are invalid", :testing_transactions => true
答案 3 :(得分:2)
我混合了两个答案,并且在RSpec 3上对我有用。
config.around(:each, use_transactional_fixtures: false) do |example|
self.use_transactional_fixtures = false
example.run
self.use_transactional_fixtures = true
DatabaseCleaner.clean_with(:deletion)
end
然后您可以在describe,context或block中使用它
describe 'my test', use_transactional_fixtures: false do
...
end
答案 4 :(得分:1)
不确定这是否适用于RSpec2,但适用于3。
config.use_transactional_fixtures = true
config.around(:each, use_transactional_fixtures: false) do |example|
self.use_transactional_tests = false
example.run
self.use_transactional_tests = true
end
注意use_transactional_fixtures
(rspec-rails选项)和use_transactional_tests
(activerecord fixtures选项)的区别。
答案 5 :(得分:0)
在使用Rspec 2.3.8时,使用use_transactional_tests
代替use_transactional_fixtures
def without_transactional_fixtures(&block)
self.use_transactional_tests = false
before(:all) do
DatabaseCleaner.strategy = :truncation
end
yield
after(:all) do
DatabaseCleaner.strategy = :transaction
end
self.use_transactional_tests = true
end