控制器操作未在rspec测试中运行

时间:2014-01-28 22:03:20

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

我正在尝试测试我拥有的控制器的索引操作。我希望它返回属于用户的名为Moments的实例。我正在使用FactoryGirl和Rspec。我验证用户有时间,就像我呼叫@user.moments时一样,它会返回它们。但是,当我使用get :index时,它会返回一个空的response.body 200。

这是我的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

2 个答案:

答案 0 :(得分:1)

expect(controller).to receive(:index)

你刚刚控制了你的控制器动作。控制器操作中的所有代码现在都没有运行。删除此行。

答案 1 :(得分:1)

Derek说的是什么,你还需要传递请求的格式:

get :index, format: :json

因为您的控制器只会respond_to :json

相关问题