2014-01-28 2 views
0

Я пытаюсь проверить действие индекса контроллера, который у меня есть. Я хочу, чтобы он возвращал экземпляры того, что называется Moments, которые принадлежат пользователю. Я использую FactoryGirl и Rspec. Я проверяю, что у пользователя есть моменты, например, когда я звоню @user.moments, он возвращает их. Однако, когда я использую get :index, он возвращает 200 с пустым response.body.Действие контроллера не работает в тесте rspec

Вот мой Rspec:

require 'spec_helper' 

describe Api::V1::MomentsController do 

    before do 
     @moment = FactoryGirl.create(:moment) 
    end 
    it 'should return moments' do 
     expect(controller).to receive(:index) 
     @user = @moment.user 
     request.env['Authorization'] = "Token token=#{@user.authentication_token}" 
     get :index 
     expect(response.status).to eq(200) 
     puts response.body 
    end 
    after do 
     @moment = nil 
     @user = nil 
    end 
end 

Вот моя фабрика:

FactoryGirl.define do 
    def time_rand from = 0.0, to = Time.now 
     Time.at(from + rand * (to.to_f - from.to_f)) 
    end 
    sequence :email do |n| 
     "email#{n}@ploonky.com" 
    end 
    sequence :fullname do |n| 
     "Waiter Number#{n}" 
    end 
    sequence :handle do |n| 
     "Person#{n}" 
    end 

    factory :user, :aliases => [:owner] do 
     fullname 
     birthdate "1978-12-12" 
     email 
     password "password1" 
     password_confirmation "password1" 
     handle 
     tags { 
     Array(10).sample.times.map do 
      FactoryGirl.create(:tag) 
     end 
     } 
    end 
    sequence :datetime do 
    "#{time_rand}" 
    end 
    factory :moment do 
    datetime 
    text "can't wait to get through this busy day" 
    association :location, :factory => :location 
    user_id { location.user_id } 
    is_public true 
    is_deleted false 
    end 

    factory :location do 
    label "home" 
    street "248 Mckibbin st" 
    city "brooklyn" 
    state "NY" 
    zip "11206" 
    latitude 40.7063048 
    longitude -73.9396323 
    association :user, :factory => :user 
    country "USA" 
    is_deleted false 
    end 

    factory :tag do 
    value "busy as hell" 
    is_deleted false 
    end 
end 

И, наконец, действие контроллера:

class Api::V1::MomentsController < ApplicationController 
    before_filter :restrict_access, :except => :public 
    respond_to :json 
    def index 
    updateDate=params['updated_at'] ? DateTime.iso8601(params['updated_at']) : nil 
    include_deleted = params['include_deleted'] ? params['include_deleted'].to_i : nil 

    friends_ids=Friendship.get_friends(api_user,Friendship::APPROVED) 
    friends_ids=friends_ids.map do |friend_ids| 
     if friend_ids 
     friend_ids[:id] 
     end 
    end 
    user_ids=friends_ids.append(api_user.id) 

    moments=Moment.user_moments(user_ids, include_deleted == 1) 

    #filter out moments older than updateDate 
    if updateDate 
     moments=moments.where('updated_at>?',updateDate) 
    end 
    moments=buildFullMoments(moments, api_user) 
    render :json => moments 
    end 
end 
+0

у меня был тот же вопрос, но причина была моим испытанием пользователь фактически не аутентифицировался, и это просто не было очевидным, поскольку фактическая ошибка не возникает. Поэтому я думаю, что это хорошая идея, чтобы сначала взглянуть на то, какие методы обрабатывают аутентификацию, прежде чем спускать потенциальную кроличью лунку. – Ravenstine

ответ

1
expect(controller).to receive(:index) 

Вы только что затушил ваше действие контроллера. Ни один из кода в действии вашего контроллера не запущен. Удалите эту строку.

+0

Удивительный, работает как шарм. Я новичок в rspec, спасибо за помощь. – prospekt

1

Что сказал Дерек, а также вы должны пройти в формате запроса:

get :index, format: :json 

, поскольку контроллер будет только respond_to :json

+0

Хороший улов, спасибо, запустил его – prospekt

Смежные вопросы