【问题标题】:How can I disable MySQL unique constraints in a RSpec test如何在 RSpec 测试中禁用 MySQL 唯一约束
【发布时间】:2015-10-06 18:24:39
【问题描述】:

我正在尝试为一个脚本运行一个规范,该脚本将唯一化给定的表。

我现在在我的迁移中有独特的限制,所以我很难创建副本来测试我的脚本。

我目前的规格是这样的。

require 'spec_helper'

describe OneTime::UniquifyTypeDescriptorContext do

  before(:each) do
    duplicated_type_descriptor_contexts = FactoryGirl.build_list(:type_descriptor_context, 5, {:type_name => :foo})
    ActiveRecord::Base.connection.execute('SET unique_checks=0;')
    duplicated_type_descriptor_contexts.each{|tdc| tdc.save!(:validate => false)}
    ActiveRecord::Base.connection.execute('SET unique_checks=1;')
    FactoryGirl.create(:type_descriptor_context, :type_name => :bar)
  end

  context "#process!" do
    it "should remove duplicates" do
      OneTime::UniquifyTypeDescriptorContext.new.process!
      expect(TypeDescriptorContext.count).to eq 2
    end
  end
end

但它一直在失败

ActiveRecord::RecordNotUnique:
       ActiveRecord::JDBCError: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry 'foo' for key 'index_type_descriptor_contexts_on_type_name': INSERT INTO `type_descriptor_contexts` (`created_at`, `type_name`, `updated_at`) VALUES ('2015-10-06 18:23:39', 'foo', '2015-10-06 18:23:39')

我错过了什么吗?

【问题讨论】:

  • 我不得不问,为什么您需要拥有/测试在无法创建重复记录的表中唯一化记录的功能?
  • 因为以前不是这样的。我正在添加迁移以添加约束,但我需要先运行脚本以删除重复项。我的规范从运行所有迁移开始,因此它们运行添加约束的迁移,此时我无法创建错误数据来测试我的脚本。

标签: mysql ruby-on-rails rspec


【解决方案1】:

可能需要有人确认。

SET unique_checks=0; 不是全局操作。如果你想让它工作,那么你必须这样写:

ActiveRecord::Base.connection.execute <<-SQL
  SET unique_checks=0;
  INSERT INTO <table_name> VALUES ....
  SET unique_checks=1;
SQL

或者您可以删除唯一索引,创建记录,然后重新创建索引。

【讨论】:

    猜你喜欢
    • 2019-09-23
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 2010-11-16
    • 1970-01-01
    • 2021-08-03
    • 2023-03-18
    相关资源
    最近更新 更多