我已经在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
我两个都失败了。请查看代码并帮我弄清楚。
答案 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
了解您的回复效果。