Я пытаюсь проверить действие индекса контроллера, который у меня есть. Я хочу, чтобы он возвращал экземпляры того, что называется 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
у меня был тот же вопрос, но причина была моим испытанием пользователь фактически не аутентифицировался, и это просто не было очевидным, поскольку фактическая ошибка не возникает. Поэтому я думаю, что это хорошая идея, чтобы сначала взглянуть на то, какие методы обрабатывают аутентификацию, прежде чем спускать потенциальную кроличью лунку. – Ravenstine