関連記事
factorybot
- 以下のようなテストを書いている場合、it の中で
@app
がnilになる
before(:context) do
@workspace = FactoryBot.create(:workspace)
@app = FactoryBot.create(:app, workspace_id: @workspace.id)
@channel = FactoryBot.create(:channel, workspace_id: @workspace.id)
context "sessionを伴うtest" do
let(:rspec_session) { { workspace_id: @workspace.id } }
it "テキストメッセージを新規登録できる事" do
p @app
p @channel
end
end
- @channelはちゃんと値が出力される
- itの中で、
@app = FactoryBot.create(:app, workspace_id: @workspace.id)
を定義すると、その後で@app
するとちゃんと値が出力される
before(:context)
- この時、
before(:context) do
ではなく、before do
にすると、itの中で@app
を出力できるようになる
- どうやら、before(:context) do => context do => it doの順で動く時、
context do
を噛ませると @app
がnil になる という所までは分かった。だが、なぜそうなるのか分からない。
let(:app) { FactoryBot.create(:app, workspace_id: @workspace.id) }
をcontext do
に書くと、it do
内でapp
で出力できた
- しかしなぜ
@channel
はできて、@app
ができないのか両者のmodelなどの違いを見て行ったが、原因分からず。
- 結局、原因は変数名(@app)だった。 予約されているらしい。他の名前にしたら出力された。すごい時間掛かった。
ログイン
- omniauthなどはテストモードというのがあって、テストでのログイン方法を提供しているが、「sign in with slack」では提供されてない
- rpsecでは、sessionが使えない為、ログイン後の挙動をテストできない
- => 結局rspecでsessionを書き込めるように
rails_helper.rb
を書き換えて実現した。これもかなり時間掛かった。