用rspec测试ruby中的“create”方法

时间:2012-07-03 08:10:50

标签: ruby-on-rails rspec

我已经在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

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

3 个答案:

答案 0 :(得分:5)

我怀疑你使用Devise后没有登录?

也许您需要包含设计测试人员:

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

  #assertions go here
end

答案 1 :(得分:1)

正如Tigraine所说,看起来你可能没有在测试执行时登录(使用Devise)。但是,显示失败将有助于进一步缩小问题。

最重要的是,第二个测试并不是真正的集成测试,我可能更喜欢以下类似测试相同条件。您可以执行两种类型的测试:

# 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

答案 2 :(得分:0)

不要忘记将此行添加到 spec_helper.rb

require "devise/test_helpers"
include Devise::TestHelpers

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

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

可以随时使用:

puts response.inspect

了解您的回复效果。