Railsのプロジェクトで下記のようなバッチを作っています。
ユーザーの数を集計して、集計結果を結果テーブルのレコードへ追加するというだけのものです。
現在こちらのテストを書こうとしているところです。
普通の環境だったら良いのですが、こちらのアプリが Apartment
でマルチテナントにしてあります。
テストをしたときにDBのレコード数が0になってしまい
ruby
1namespace :app do 2 namespace :batch do 3 task collect_invalid_user_count: :environment do 4 month = Time.zone.now.beginning_of_month 5 exec_each_tenant_callback do |_| 6 invalid_user_count = User.where( 7 del_flg: true, 8 consultant_flg: false, 9 support_flg: false, 10 created_at: Time.zone.now.ago(1.month).all_month 11 ).count 12 13 BatchResultUser.create(month: month, invalid_user_count: invalid_user_count) 14 end 15 end 16 17 def exec_each_tenant_callback 18 Client.where(del_flg: false).each do |client| 19 Apartment::Tenant.switch(client.sub_domain) do 20 yield client 21 end 22 end 23 end 24 end 25end 26
以下書きかけのテストです。
is succeed.
は通るのですが、 created record
は失敗しカウントは0になります。
ruby
1require 'rails_helper' 2require 'rake' 3 4describe 'monthly_bath' do 5 6 before(:all) do 7 @rake = Rake::Application.new 8 Rake.application = @rake 9 Rake.application.rake_require 'tasks/monthly_batch' 10 Rake::Task.define_task(:environment) 11 end 12 13 before(:each) do 14 @rake[task].reenable 15 end 16 17 let!(:client) { create(:client) } 18 let!(:user) do 19 Apartment::Tenant.switch!(client.sub_domain) 20 create(:new_user) 21 end 22 23 describe 'collect_invalid_user_count task' do 24 let(:task) { 'app:batch:collect_invalid_user_count' } 25 26 it 'is succeed.' do 27 expect(@rake[task].invoke).to be_truthy 28 end 29 30 it 'created record' do 31 Apartment::Tenant.switch!(client.sub_domain) 32 expect(BatchResultUser.all.count).to eq 1 33 end 34 end 35end
↓現在はこんな感じでひとまず通してます
これで良いのでしょうか?
subject { -> {@rake[task].invoke}} it 'create BatchResultPosition record' do is_expected .to change { BatchResultPosition.find_by(month: Time.zone.now.beginning_of_month) } .from(nil) .to( have_attributes( (パラメータをチェック) ) ) end
よろしくおねがいします。
taskについての情報はたくさんありますが、問題が出ているのはtaskの実行以前のBatchResultUserの動きの様に思えます。
BatchResultUserの実行前にbefore(:all) before(:each) で行われている設定がBatchResultUserにどう影響するのか、
Apartment::Tenant.switch!とは何をするものなのか、
BatchResultUserが作成されるのはどういうときなのか
そういう情報がないと何もわかりません。
beforeブロック内でやっているのはtaskを実行するための準備という認識です。
下記リンクなどを参考にしています。
https://qiita.com/kawakubox/items/26cf71a14bd5827175f6
BatchResultUserはただのmodelです。これらの設定は影響しないものだと思っています。
Apartment::Tenant.switch!がなにをやっているか詳細はわかりませんが、おおよそサブドメインによって使うDBを変更している?みたいな認識です。
https://github.com/influitive/apartment
すると、BatchResultUserにデータを追加するにはなにか操作が必要と思うのですが、提示されているcodeにはみあたらないですが
BatchResultUser.create(month: month, invalid_user_count: invalid_user_count)
ではなくてですか?
失礼、reenable見落としてました。
すると、BatchResultUser.create の実装がわからないとなんともですが、invalid_user_countがゼロのときにはひとつも作らずに正常終了とかあります?
いえ、createはRailsのActiveModelに用意されているものなのになりますので、実装はわからないです。
パラメータはmonthとinvalid_user_countがあれば大丈夫です。
invalid_user_countはnilでなければ通ります。0なら0でレコードを作成します。
すると、 create(:new_user) が条件を満たすUserを作っているか?
ですが、そこはOK?
あなたの回答
tips
プレビュー