概要
RSpecでtestを走らせているのですが、普通にdevelopmentで動かしたときは正常に動作するのに、
RSpecを走らせたときは異なる挙動をするためにtestが落ちてしまいます。
原因が分かる方、ご回答宜しくお願いします。
状況
以下のようなデバック目的のコードを書いて、挙動の違いを際立たせるようにしました。
(今回の挙動の違いを説明する以外のコードは省略しています)
- schema(ridgepole)
ruby
1create_table "articles", force: :cascade do |t| 2 t.integer "category_id", null: false, unsigned: true, default: 1 3 t.string "title" 4 t.text "description" 5 t.string "image" 6 t.integer "pv_count", null: false, unsigned: true, default: 0 7 t.integer "released", limit: 1, null: false, default: 0 8 t.datetime "deleted_at" 9 t.datetime "created_at" 10 t.datetime "updated_at" 11end
- routing
ruby
1Rails.application.routes.draw do 2 resources 'articles' 3end
- controller
ruby
1class ArticlesController < ActionController::Base 2 def create 3 @article = Article.create 4 raise if @article.id == nil # ここに注目 5 redirect_to edit_article_path(@article) 6 end 7end
- controller spec
ruby
1require 'rails_helper' 2 3RSpec.describe ArticlesController, type: :controller do 4 it "creates new article in the database" do 5 post :create 6 expect(renponse).to redirect_to edit_article_path(assigns[:article]) 7 end 8end
Run Test
ブラウザで普通にarticles#create
にリクエストすると
@article.id == nil
はfalseになって正常に処理されるのですが、
$bundle exec rspec
でtestを走らせると@article.id == nil
が何故かtrueになってraiseされます。
何故testになるとこの部分の挙動が違うのでしょうか。
(idが生成されていない -> DBにsaveされずにinstanceだけ生成されている -> newと同じ挙動??)
ちなみにversionは
ruby 2.3.0
rails 5.0.0
RSpec 3.5.1
です。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。