悲观锁定无法在重新加载时正常工作

时间:2018-10-02 23:15:53

标签: ruby-on-rails ruby ruby-on-rails-3 locking factory-bot

悲观锁在重新加载时(在测试用例中使用)无法正常工作。 with_lockreload不能一起正常工作,并且测试用例失败。如果我删除了with_lock,那么测试用例就可以正常工作。

def method_name1
  self.with_lock do
    attributes["amount_used"] = get_total_amount_used
    attributes["updated_at"] = Time.now.utc
    Product.where(:id => self.id).update_all(attributes)
  end
end

我已经使用FactoryGirl编写了单元测试用例。它调用method_name1,该方法将在使用量之后重新计算总数。如果您检查第一个测试用例1:合计= 600,used_used = -200(-ve表示减少),则合计应为400.00。同样,对于“测试用例2”,运行“测试用例1”后总计为400.00。 amount_used = 200(+ ve表示加),总计应为600.00。但是测试用例2说的是800.00。

context 'description' do
  before(:each) do
    @product.total = 600
    @product.method_name1
  end

  it 'is updated automatically if valid' do
    @product.amount_used = -200
    @product.save
    @product.reload
    should eq('400.0')       #Working
  end

  it 'is not changed if invalid' do
    @product.amount_used = 200
    @product.save
    @product.reload
    should eq('600.0')      #Not Working
  end
end

测试案例2的错误: 失败/错误:应为eq('600.0')

   expected: "600.0"
        got: "800.0"

   (compared using ==)

1 个答案:

答案 0 :(得分:1)

测试结果800是正确答案。

before(:each) do
  @product.total = 600
  @product.method_name1
end

before(:each)意味着将在运行每个示例之前执行这段代码,因此600 + 200为800。如果只运行一次,则必须使用before(:all),然后这段代码在运行两个示例之前将只运行一次。

您可以在官方documentation中看到更多信息。