如何使用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
我还能尝试什么?
这曾经是一个错误(见ticket #197),但我现在似乎没事。我只是不知道它是否适用于每个测试基础(可能不是)。如果你想这样做,你可以通过将config.use_transactional_fixtures = false
放在spec_helper.rb
上并使用DatabaseCleaner来设置它来全局禁用事务夹具。
我在浏览器上使用javascript测试页面时遇到了类似的问题(这种情况不适用于事务性灯具)。以下是我设法解决它的方法:http://github.com/lailsonbm/contact_manager_app
我通常会添加一个这样的帮手:
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
我这样做了,使用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
不确定这是否适用于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选项)的区别。
我混合了两个答案,它在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或it块中使用它
describe 'my test', use_transactional_fixtures: false do
...
end
使用use_transactional_tests
而不是use_transactional_fixtures
当使用Rspec 2.3.8时
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