RSpec事务测试在以前(:each)中持续更改实例变量

时间:2017-08-08 00:05:39

标签: ruby-on-rails ruby activerecord rspec

... SO

我有一个RSpec测试问题,我试图配置一个特定的设置(不创建新数据,但修改实例数据),并且在运行测试用例后,数据不会被还原。请看下面的一个简单示例,并注意foo是一个ActiveRecord对象......     要求' rails_helper'

RSpec.describe My::Code do
  before(:context) do
    @foo = FactoryGirl.create(:foo)
  end

  after(:context) do
    @foo.destroy!
  end

  let(:foo) { @foo.clone }

  describe 'something' do
    # Imagine `something` just returns foo.bar, which is an over-
    # simplification, but gives you an idea of the problem I am seeing
    subject { My::Code.something(foo) }

    context 'when foo has different property value' do
      before(:each) do
        foo.bar = false
      end

      it { is_expected_to be(false) }
    end

    context 'when foo has original property value' do
      # This will fail, as foo's bar property is still false
      it { is_expected_to be(true) }
    end
  end

......这是我的情况的要点,我无法弄清楚为什么RSpec不回滚。我的rails_helper文件中的一小部分......

config.use_transactional_fixtures = true
...
config.around(:each) do |example|
  DatabaseCleaner.cleaning do
    example.run
  end
end

......非常感谢任何见解。

1 个答案:

答案 0 :(得分:0)

在Ruby on Rails中,使用clone,这似乎是预期的行为:

  

与Ruby的克隆方法相同。这是一个“浅薄”副本。 请注意,不会复制您的属性。这意味着修改克隆的属性将修改原始属性,因为它们都指向相同的属性哈希。如果需要属性哈希的副本,请使用dup方法。

强调我的。因此,通过使用clone,您仍然指向相同的属性哈希,而修改一个则修改另一个。

如您所知,您可以reload删除所有更改的对象,或者您可以拨打dup而不是clone

  

请注意,这是一个“浅”副本,因为它只复制对象的属性,而不是它的关联。