2015-10-06 81 views
0

我正在嘗試運行一個腳本的規範,以獨立化給定的表。我如何禁用RSpec測試中的MySQL唯一約束

我現在在我的遷移中有獨特的約束,所以我很難創建重複測試我的腳本。

我目前的規格是這樣的。

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

難道我失去了一些東西?

+1

我不得不問,爲什麼你需要擁有/測試功能,在表中記錄獨特化的記錄不能創建重複記錄? – Magnuss

+0

因爲情況並非如此。我添加了一個遷移來添加約束,但我需要先運行該腳本以刪除重複項。我的規格從運行所有遷移開始,以便運行添加約束條件的那個,並且我無法創建不良數據來測試腳本。 –

回答

0

有人可能需要確認這一點。

SET unique_checks=0;不是全球性操作。如果你想要這個工作,那麼你就必須把它寫這樣的:

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

或者你可以放下唯一索引,創建記錄,之後重新創建索引。