generalistからspecialistへ

一点集中化計画

特に詰まった箇所:テスト系

関連記事


factorybot

  • 以下のようなテストを書いている場合、it の中で@appnilになる
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を噛ませると @appnil になる という所までは分かった。だが、なぜそうなるのか分からない
  • 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を書き換えて実現した。これもかなり時間掛かった。