当我尝试将数据从文件导入数据库进行测试时,我遇到了问题。以下代码完全按照我的预期在Ruby shell中执行:
jruby-1.7.4 :001 > require('sequel')
=> true
jruby-1.7.4 :002 > require('csv')
=> true
jruby-1.7.4 :003 > file = CSV.read('./spec/test_data/registration_sessions.csv')
=> [["01", "EG000000001"], ["02", "EG000000002"], ["03", "EG000000002"]]
jruby-1.7.4 :004 > db = Sequel.connect('jdbc:sqlite::memory:')
=> #<Sequel::JDBC::Database: "jdbc:sqlite::memory:">
jruby-1.7.4 :005 > db.create_table(:registration_sessions) do
jruby-1.7.4 :006 > Integer :id
jruby-1.7.4 :007?> String :device_serial
jruby-1.7.4 :008?> end
=> nil
jruby-1.7.4 :009 > db[:registration_sessions]
=> #<Sequel::JDBC::Dataset: "SELECT * FROM `registration_sessions`">
jruby-1.7.4 :010 > db[:registration_sessions].import(db[:registration_sessions].columns, file)
=> ["INSERT INTO `registration_sessions` (`id`, `device_serial`) VALUES ('01', 'EG000000001')", "INSERT INTO `registration_sessions` (`id`, `device_serial`) VALUES ('02', 'EG000000002')", "INSERT INTO `registration_sessions` (`id`, `device_serial`) VALUES ('03', 'EG000000002')"]
jruby-1.7.4 :012 > db[:registration_sessions].all
=> [{:id=>1, :device_serial=>"EG000000001"}, {:id=>2, :device_serial=>"EG000000002"}, {:id=>3, :device_serial=>"EG000000002"}]
但在我的测试中,事情并没有按预期发展:
let(:registration_metrics_db) { create_registration_metrics_db }
let(:session_seed_data) { CSV.read('./spec/test_data/registration_sessions.csv') }
before(:each) do
seed_test_data(registration_metrics_db[:registration_sessions], session_seed_data)
end
def create_registration_metrics_db
db = Sequel.connect('jdbc:sqlite::memory:')
db.create_table(:registration_sessions) do
Integer :id
String :device_serial
end
db
end
def seed_test_data(table, data)
table.import(table.columns, data)
end
当我运行测试时,会导致以下情况:
14) RegistrationMetricsQueries #get_registration_metrics should return only durations for sessions that contain the start and end moment
Failure/Error: seed_test_data(registration_metrics_db[:registration_sessions], session_seed_data)
Sequel::Error:
Different number of values and columns given to insert_sql
# ./spec/services/tablet_usage_queries_spec.rb:88:in `seed_test_data'
# ./spec/services/registration_metrics_queries_spec.rb:10:in `(root)'
15) RegistrationMetricsQueries #get_registration_metrics should return durations in seconds for valid registration sessions, which contain the start and end moment
Failure/Error: seed_test_data(registration_metrics_db[:registration_sessions], session_seed_data)
Sequel::Error:
Different number of values and columns given to insert_sql
# ./spec/services/tablet_usage_queries_spec.rb:88:in `seed_test_data'
# ./spec/services/registration_metrics_queries_spec.rb:10:in `(root)'
我做错了吗?
编辑:哦,我的样本数据
01,EG000000001
02,EG000000002
03,EG000000002
答案 0 :(得分:0)
事实证明,问题是未能插入的结果。有一个表连接发生在引擎盖下,它导致Sequel锁定,因为sqlite不支持正确的连接。我正在迁移我的测试以使用实际的mysql数据库,而不是内存中的sqlite db。