41

如何使用 RSpec 2 仅针对一个规范(或 Steak 场景)关闭事务装置?我尝试了一些在网上找到的东西,但没有成功。

这会导致未定义的方法异常。

描述“没有事务性装置的 MyClass”做
  self.use_transactional_fixtures = false
  ...
结尾

这根本什么都不做(事务夹具仍然打开):

描述“没有事务性装置的 MyClass”做
  RSpec.configure 做 |config|
    config.use_transactional_fixtures = false
  结尾
  ...
结尾

我还能尝试什么?

4

6 回答 6

34

我通常会添加一个这样的助手:

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
于 2011-10-09T11:37:42.317 回答
9

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

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

于 2010-10-13T00:25:51.570 回答
9

我使用 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
于 2012-05-18T15:30:29.927 回答
8

我混合了两个答案,它在 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 'my test', use_transactional_fixtures: false do
   ...
end
于 2019-02-08T20:58:04.527 回答
4

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

于 2017-11-12T08:13:46.767 回答
2

在使用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
于 2019-03-25T14:55:54.293 回答