テストが完了したらテスト用データも削除されるようにしたいので、そのときにやった対応です。
テスト対象テーブルはこんな感じです。
mysql> select * from seq_sometest4s; +----+--------+ | id | seq_id | +----+--------+ | 1 | 1 | +----+--------+ 1 row in set (0.00 sec)
テストしたいクラスです。
$ cat app/models/concerns/seq_table.rb module SeqTable def seq_incrment(klazz) base = Object.const_get(klazz) base.transaction do tbl = base.lock.find(1) tbl.increment!(:seq_id) tbl.seq_id end rescue => e raise e end end $ cat app/models/seq_sometest4.rb class SeqSometest4 < ActiveRecord::Base end $controller抜粋 seq_id = seq_incrment("SeqSometest4")
spec/rails_helper.rbに設定
config.use_transactional_fixtures = true
まずテストを書いてみました。
require 'rails_helper' describe "SeqTable" do include SeqTable seq = FactoryGirl.create(:seq_sometest4) context "#seq_incrment" do it { res = seq_incrment("SeqSometest4") expect(res).to eq (seq.seq_id + 1) } end end これだと、テスト終了後にデータが残ってしまいました。 mysql> select * from seq_sometest4s; +----+--------+ | id | seq_id | +----+--------+ | 1 | 1 | +----+--------+ 1 row in set (0.00 sec)
FactoryGirlの処理をit{}の中に持ってきてみました。
require 'rails_helper' describe "SeqTable" do include SeqTable context "#seq_incrment" do it { seq = FactoryGirl.create(:seq_sometest4) res = seq_incrment("SeqSometest4") expect(res).to eq (seq.seq_id + 1) } end end mysql> select * from seq_sometest4s; Empty set (0.00 sec)
itの中に書くことでテスト内での操作ってことになって、トランザクション内での処理ってことになるのかなと。
参考URL
https://relishapp.com/rspec/rspec-rails/docs/transactions
0 件のコメント:
コメントを投稿