2015-03-08 1 views
0

Я до сих пор довольно новичок в тестировании и все еще обволакиваю голову Factory Factory, которая, как я считаю, является виновником этой неудачи. Проще, как решение, вероятно, будет, я искал другие сообщения с тем же сообщением об ошибке, но ответы не работают на меня.Ошибка тестирования контроллера Factory Girl & Rspec

Я решил изучить 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

Попробуйте для испытаний:

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 

Лично я бы также выделить некоторые из этих предпологает вы сделали к разным тестам. Тем не менее, я не знаю, что тестирование, которое они настроены таким образом, действительно необходимо в контроллере.

Редактировать: Существует также проблема с вашим действием create, в котором, если он не будет успешно сохранен, он все равно попытается перенаправить на @post, который потерпит неудачу. Ваш тест с недопустимыми атрибутами должен подчеркнуть это.

+0

Благодарим за отзыв! Я определенно согласен, что эти ожидания выглядят лучше разделенными. Я попробовал их, и первая спецификация прошла, но вторая из них все еще терпит неудачу: 'Failure/Error: post: create, event: attributes_for (: post) ActionController :: ParameterMissing: Параметр отсутствует или значение пуст: post' – shroy

+0

Упс - обновил мой ответ ... Скопируйте и вставьте жертву: ^) – patrick

+0

Приятно снова увидеть зеленый! Спасибо, Патрик! – shroy