質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Q&A

0回答

1881閲覧

Rails マルチテナントアプリでのテストの書き方 DBのレコードが増えない

keng

総合スコア32

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

0グッド

1クリップ

投稿2019/08/01 11:04

編集2019/08/02 07:06

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

よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

winterboum

2019/08/02 01:54

taskについての情報はたくさんありますが、問題が出ているのはtaskの実行以前のBatchResultUserの動きの様に思えます。 BatchResultUserの実行前にbefore(:all) before(:each) で行われている設定がBatchResultUserにどう影響するのか、 Apartment::Tenant.switch!とは何をするものなのか、 BatchResultUserが作成されるのはどういうときなのか そういう情報がないと何もわかりません。
keng

2019/08/02 06:59

beforeブロック内でやっているのはtaskを実行するための準備という認識です。 下記リンクなどを参考にしています。 https://qiita.com/kawakubox/items/26cf71a14bd5827175f6 BatchResultUserはただのmodelです。これらの設定は影響しないものだと思っています。 Apartment::Tenant.switch!がなにをやっているか詳細はわかりませんが、おおよそサブドメインによって使うDBを変更している?みたいな認識です。 https://github.com/influitive/apartment
winterboum

2019/08/02 07:12

すると、BatchResultUserにデータを追加するにはなにか操作が必要と思うのですが、提示されているcodeにはみあたらないですが
keng

2019/08/02 08:01

BatchResultUser.create(month: month, invalid_user_count: invalid_user_count) ではなくてですか?
winterboum

2019/08/02 08:25

失礼、reenable見落としてました。 すると、BatchResultUser.create の実装がわからないとなんともですが、invalid_user_countがゼロのときにはひとつも作らずに正常終了とかあります?
keng

2019/08/02 09:04

いえ、createはRailsのActiveModelに用意されているものなのになりますので、実装はわからないです。 パラメータはmonthとinvalid_user_countがあれば大丈夫です。 invalid_user_countはnilでなければ通ります。0なら0でレコードを作成します。
winterboum

2019/08/02 09:15

すると、 create(:new_user) が条件を満たすUserを作っているか? ですが、そこはOK?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問