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

我怀疑您没有登录,因为您使用的是设计?

也许您需要包含设计 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)。但是,显示故障将有助于进一步缩小问题范围。

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

# 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的链接,您可以在其中找到有关此方法的更多信息。我建议在没有 (:each) 的情况下编写 before 方法,我记得它有时会导致问题。

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

可以随时使用:

puts response.inspect

看看你的反应是什么样子的。

于 2012-07-04T05:46:37.340 回答