Factory Girl & Rspec 控制器测试失败
Factory Girl & Rspec controller test failure
我对测试还很陌生,并且仍然在思考 Factory Girl,我认为这是这次失败的罪魁祸首。尽管解决方案可能很简单,但我搜索了具有相同失败消息的其他帖子,但答案对我不起作用。
我决定通过构建这个简单的博客应用来学习 BDD/TDD。这是失败消息:
Failures:
1) PostsController POST create creates a post
Failure/Error: expect(response).to redirect_to(post_path(post))
Expected response to be a <redirect>, but was <200>
测试:
RSpec.describe PostsController, :type => :controller do
let(:post) { build_stubbed(:post) }
describe "POST create" do
it "creates a post" do
expect(response).to redirect_to(post_path(post))
expect(assigns(:post).title).to eq('Kicking back')
expect(flash[:notice]).to eq("Your post has been saved!")
end
end
end
我的工厂女郎档案:
FactoryGirl.define do
factory :post do
title 'First title ever'
body 'Forage paleo aesthetic food truck. Bespoke gastropub pork belly, tattooed readymade chambray keffiyeh Truffaut ennui trust fund you probably haven\'t heard of them tousled.'
end
end
控制器:
class PostsController < ApplicationController
def index
@posts = Post.all.order('created_at DESC')
end
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
flash[:notice] = "Your post has been saved!"
else
flash[:notice] = "There was an error saving your post."
end
redirect_to @post
end
def show
@post = Post.find(params[:id])
end
private
def post_params
params.require(:post).permit(:title, :body)
end
end
如果相关,这是我的 Gemfile:
gem 'rails', '4.1.6'
...
group :development, :test do
gem 'rspec-rails', '~> 3.1.0'
gem 'factory_girl_rails', '~> 4.5.0'
gem 'shoulda-matchers', require: false
gem 'capybara'
end
感谢任何帮助。
试试这个进行测试:
context 'with valid attributes' do
it 'creates the post' do
post :create, post: attributes_for(:post)
expect(Post.count).to eq(1)
end
it 'redirects to the "show" action for the new post' do
post :create, post: attributes_for(:post)
expect(response).to redirect_to Post.first
end
end
就我个人而言,我还将您对不同测试所做的一些期望分开。但是,我不知道在控制器中是否真的需要测试它们的设置方式。
编辑:
您的创建操作也存在问题,如果它没有成功保存,它仍会尝试重定向到 @post ,这将失败。您的无效属性测试应该突出显示这一点。
我对测试还很陌生,并且仍然在思考 Factory Girl,我认为这是这次失败的罪魁祸首。尽管解决方案可能很简单,但我搜索了具有相同失败消息的其他帖子,但答案对我不起作用。
我决定通过构建这个简单的博客应用来学习 BDD/TDD。这是失败消息:
Failures:
1) PostsController POST create creates a post
Failure/Error: expect(response).to redirect_to(post_path(post))
Expected response to be a <redirect>, but was <200>
测试:
RSpec.describe PostsController, :type => :controller do
let(:post) { build_stubbed(:post) }
describe "POST create" do
it "creates a post" do
expect(response).to redirect_to(post_path(post))
expect(assigns(:post).title).to eq('Kicking back')
expect(flash[:notice]).to eq("Your post has been saved!")
end
end
end
我的工厂女郎档案:
FactoryGirl.define do
factory :post do
title 'First title ever'
body 'Forage paleo aesthetic food truck. Bespoke gastropub pork belly, tattooed readymade chambray keffiyeh Truffaut ennui trust fund you probably haven\'t heard of them tousled.'
end
end
控制器:
class PostsController < ApplicationController
def index
@posts = Post.all.order('created_at DESC')
end
def new
@post = Post.new
end
def create
@post = Post.new(post_params)
if @post.save
flash[:notice] = "Your post has been saved!"
else
flash[:notice] = "There was an error saving your post."
end
redirect_to @post
end
def show
@post = Post.find(params[:id])
end
private
def post_params
params.require(:post).permit(:title, :body)
end
end
如果相关,这是我的 Gemfile:
gem 'rails', '4.1.6'
...
group :development, :test do
gem 'rspec-rails', '~> 3.1.0'
gem 'factory_girl_rails', '~> 4.5.0'
gem 'shoulda-matchers', require: false
gem 'capybara'
end
感谢任何帮助。
试试这个进行测试:
context 'with valid attributes' do
it 'creates the post' do
post :create, post: attributes_for(:post)
expect(Post.count).to eq(1)
end
it 'redirects to the "show" action for the new post' do
post :create, post: attributes_for(:post)
expect(response).to redirect_to Post.first
end
end
就我个人而言,我还将您对不同测试所做的一些期望分开。但是,我不知道在控制器中是否真的需要测试它们的设置方式。
编辑: 您的创建操作也存在问题,如果它没有成功保存,它仍会尝试重定向到 @post ,这将失败。您的无效属性测试应该突出显示这一点。