1

このコントローラーコードは Ruby on Rails で書きました

class PostsController < ApplicationController
  before_filter :authenticate_user!

  def index  
    @posts = Post.all(:order => "created_at DESC")  
    respond_to do |format|  
      format.html  
    end  
  end  

  def create  
    @post = Post.create(:message => params[:message])  
    respond_to do |format|  
      if @post.save  
        format.html { redirect_to posts_path }  
        format.js
      else  
        flash[:notice] = "Message failed to save."  
        format.html { redirect_to posts_path }  
      end  
    end  
  end  
end

これに対応して、次のテストケースを作成しました:-

require 'spec_helper'

describe PostsController do
  describe "GET 'index'" do
    it "returns http success" do
      get 'index'
      response.should be_success
    end
  end

  describe "#create" do
    it "creates a successful mesaage post" do
      @post = Post.create(message: "Message")
      @post.should be_an_instance_of Post
    end
  end
end

両方で失敗しています。コードを見て、私が理解するのを手伝ってください。

4

3 に答える 3

5

Devise を使用しているため、ログインしていないのではないでしょうか?

おそらく、devise testhelpers を含める必要があります:

describe PostsController do
  include Devise::TestHelpers
  before(:each) do
    @user = User.create(...)
    sign_in @user
  end

  #assertions go here
end
于 2012-07-03T08:36:26.993 に答える
1

Tigraine が述べているように、テストが実行されると、おそらく (Devise で) ログインしていないように見えます。ただし、失敗を示すことは、問題をさらに絞り込むのに役立ちます。

その上、2 番目のテストは実際には統合テストではないため、同じ条件をテストするには、おそらく次のようなものを好むでしょう。実行できるテストには 2 つのタイプがあります。

# inside 'describe "#create"'

let(:valid_params) { {'post' => {'title' => 'Test Post'} }

it 'creates a new Post' do
  expect {
    post :create, valid_params
  }.to change(Post, :count).by(1)
end

# and / or

it 'assigns a new Post' do
  post :create, valid_params
  assigns(:post).should be_a(Post)
  assigns(:post).should be_persisted
end
于 2012-07-03T09:03:38.453 に答える
0

この行をspec_helper.rbに追加することを忘れないでください

require "devise/test_helpers"
include Devise::TestHelpers

それにもかかわらず、Devise wiki - How to test Controllersのリンクは、このアプローチに関する詳細情報を見つけることができます。before メソッドを (:each) なしで書くことをお勧めします。覚えていると、問題が発生することがあります。

before do
 @user = FactoryGirl.create(:user)
 sign_in @user
end

いつでも使用できます:

puts response.inspect

あなたの反応がどのように見えるかを見るため。

于 2012-07-04T05:46:37.340 に答える