mysql - 如何在 RSpec 测试中禁用 MySQL 唯一约束

标签 mysql ruby-on-rails rspec

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

现在,我的迁移受到独特的限制,因此我很难创建重复项来测试我的脚本。

我当前的规范看起来就是这样。

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')

我错过了什么吗?

最佳答案

可能需要有人确认这一点。

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

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

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

关于mysql - 如何在 RSpec 测试中禁用 MySQL 唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32976997/

相关文章:

mysql - LOAD FILE,最后一行和最后一列输出错误

mysql - 根据多对多表中的 Count() 更新表

unit-testing - 使用 TDD/BDD 开发 XSLT

ruby-on-rails - RSpec - NoMethodError 对于在关联模型上调用的方法

php - 显示数组输出

PHP MySQL INSERT语句语法错误

ruby-on-rails - webbrowser 和 rails 之间发生了什么

ruby-on-rails - 在 Rails 中的何处设置跟踪(永久)cookie?

ruby-on-rails - 如何为 Assets :precompile? 覆盖 gem Assets 中的单个文件

ruby-on-rails - 用于构建新操作的 rspec 匹配器