简体   繁体   中英

Controller action not running in rspec test

I'm trying to test the index action of a controller that I have. I want it to return instances of something called Moments, which belong to a user. I am using FactoryGirl and Rspec. I verify the user has moments, as when I call @user.moments , it returns them. However when I use get :index , it returns a 200 with an empty response.body .

Here is my 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

Here is my Factory:

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

And finally, the controller action:

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
expect(controller).to receive(:index)

You've just stubbed your controller action. None of the code in your controller action is now running. Remove this line.

What Derek said and also you need to pass in the format of the request:

get :index, format: :json

since your controller will only respond_to :json

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM