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

问题描述 投票:34回答:6

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

我还能尝试什么?

ruby-on-rails ruby-on-rails-3 rspec rspec2
6个回答
7
投票

这曾经是一个错误(见ticket #197),但我现在似乎没事。我只是不知道它是否适用于每个测试基础(可能不是)。如果你想这样做,你可以通过将config.use_transactional_fixtures = false放在spec_helper.rb上并使用DatabaseCleaner来设置它来全局禁用事务夹具。

我在浏览器上使用javascript测试页面时遇到了类似的问题(这种情况不适用于事务性灯具)。以下是我设法解决它的方法:http://github.com/lailsonbm/contact_manager_app


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

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

2
投票

不确定这是否适用于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选项)的区别。


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或it块中使用它

describe 'my test', use_transactional_fixtures: false do
   ...
end

0
投票

使用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
© www.soinside.com 2019 - 2024. All rights reserved.