工厂女孩& Rspec控制器测试失败

时间:2015-03-08 20:51:04

标签: ruby-on-rails rspec tdd factory-bot rspec3

我仍然很擅长测试,仍然围绕着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

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

试试这个测试:

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。您的无效属性测试应突出显示。