使用RSpec 2关闭一个规格的事务夹具

时间:2010-10-04 05:35:12

标签: ruby-on-rails ruby-on-rails-3 rspec rspec2

如何使用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

我还能尝试什么?

6 个答案:

答案 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