我的模型中有一个permalink字段,它在Rails中有唯一性验证,在MySQL中有唯一索引。当我通过我的应用程序接口导入数据时,有时会发生这样的情况,两个请求具有相同的permalink值,并且它们试图同时保存。
在这种情况下,我没有得到唯一性验证错误,我得到了一个错误:
ActiveRecord::RecordNotUnique: Mysql2::Error: Duplicate entry 'permalink123' for key 'index_products_on_permalink'我处理这种情况的方法是在一个拯救块中扭曲保存,在固定链接的末尾添加一个随机值,然后再次尝试保存。当第二次保存也产生错误时,将引发该错误。
但是如何在RSpec中测试这种行为呢?在测试过程中,我尝试禁用唯一性验证。
Product.class_eval do
validates :permalink, uniqueness: false
end但这不会抛出MySQL错误。我也不认为用expect(product).to receive(:save).and_raise(Mysql2::Error)截断错误是正确的方法,因为当error类和/或error字符串发生更改时会发生什么?
有没有一种方法,我可以在测试期间生成一个Mysql2:Error,它是由mysql中的唯一索引错误引起的?
发布于 2017-11-16 18:56:08
1)如果测试数据库没有抛出相同的错误,那么通过存根保存来引发正确的错误对我来说似乎没什么问题:)这肯定不是很理想,但归根结底,这是一项测试,所以您只想确保以您期望的方式处理这种情况。不过,关于原因的评论绝对是合情合理的!
2)我相信这取决于您如何配置测试数据库。根据我的经验,FactoryGirl不会抛出唯一的索引错误,这是特别烦人的……
https://stackoverflow.com/questions/47326551
复制相似问题