2012-07-03 91 views
1

我已经Ruby编写这个控制器代码on Rails的测试“创造”使用RSpec

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 

我两者都失败了。请看看代码,并帮我弄清楚。

+1

您能否包含错误消息? – Stefan

回答

5

我怀疑你没有登录,因为你正在使用Devise?

也许你需要包括色器件testhelpers:

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

    #assertions go here 
end 
1

由于Tigraine状态,当测试得到执行看起来好像你可能没有登录(与设计)。但是,展示失败将有助于进一步缩小问题范围。

最重要的是,第二个测试不是真正的集成测试,我可能更喜欢类似以下的东西来测试相同的条件。有两种类型的测试,你可以这样做:

# 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 
+0

它说,NoMethodError: 未定义的方法'symbolize_keys'为“valid_params”:字符串 –

+0

对不起,'valid_params'应该是一个哈希镜像Post模型的一组有效属性。 '{'post'=> {'name'=>'Test'}}' – Adam

0

不要忘了此行添加到您的spec_helper.rb

require "devise/test_helpers" 
include Devise::TestHelpers 

尽管如此,这里是链接Devise wiki - How to test Controllers在那里你可以找到有关此方法的更多信息。我建议在没有(:each)的情况下编写before方法,我记得它有时会导致问题。

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

可以随时使用:

puts response.inspect 

看到您的回复的样子。