0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

controller specでActionView::Missing Templateエラーが出る

Posted at

末尾で他のaction(do_create、仮)を呼び出すcreateのテストを書いたとき、

      it 'do_createが呼ばれる' do
        expect(controller).to receive(:do_create).and_return(true)
        post :create, params
      end

といつも通り書いたところ、下記のようなエラーが出た。

ActionView::MissingTemplate:
       Missing template path/to/create, ..., application/create with {:locale=>[:en, :ja], :formats=>[:html], :variants=>[], :handlers=>[:erb, :builder, :raw, :ruby, :slim, :coffee, :haml, :jbuilder]}. Searched in:

要はrenderするときに指定されたテンプレートファイルが見つからないよ、というエラー

原因

createにおいてはdo_createがメインの処理で、その中でリダイレクトしたりエラーを出したりあるいはrenderしたりする。
つまり、do_createをスタブ化してしまったらこのアクションは存在しない自身のviewファイルを探しにいってしまいエラーが出てしまうということだと思われる。

対策

まず、仮にテンプレートファイルを置いてみた。

$ touch path/to/create.html

はい、これだけで問題なく通りました。
しかしこれではコミットできないので、do_createのスタブの中身を適当に存在するテンプレートを呼ぶrenderに変えてみた。

expect(controller).to receive(:do_create) { render_template :edit }
post :create, params

しかしこれでは駄目。メソッドの最後にrenderを置いているのになぜ?恐らく書き方が悪いんだと思うがどこが悪いのかわからない。

そこでエラーを投げるようにしてみた。

expect(controller).to receive(:do_create).and_raise(DummyError)
expect { post :create, params }.to raise_error(DummyError)

DummyErrorクラスは実際のエラーと区別するためにspecファイルの中で定義したエラークラス。これで一応動いた。バッドプラクティス感がすごいが、メモとして残しておきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?