悲观锁在重新加载时(在测试用例中使用)无法正常工作。 with_lock
和reload
不能一起正常工作,并且测试用例失败。如果我删除了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 ==)
答案 0 :(得分:1)
测试结果800是正确答案。
before(:each) do
@product.total = 600
@product.method_name1
end
before(:each)
意味着将在运行每个示例之前执行这段代码,因此600 + 200为800。如果只运行一次,则必须使用before(:all)
,然后这段代码在运行两个示例之前将只运行一次。
您可以在官方documentation中看到更多信息。