简体   繁体   中英

Getting Failure/error and NoMethod Error in rails

The following is my search method from the controller

@accounts = []
    client = GameAccounts::GameAccountsClient.new



    if params[:name]


      # Try and find a game account by id using the given name
      response = client.get_accounts_by_name(params[:name])

      if response.is_a?(Net::HTTPSuccess)
        account = client.parse_json(response)
        unless account.empty?
          session[:account] = account
          redirect_to game_account_path(params[:name])
        end
      end

      json = client.get_json(params[:limit],params[:offset],params[:name])

      @presenter = GameAccountsPresenter.new(json)

    end
  end

I am trying to run the following test :

require 'spec_helper'

describe GameAccountsController do
  describe 'GET search' do
    it 'finds a named system account directly' do
     get(:search, name: 'test').to be_redirect_to(game_account_path('test'))
    end
  end
end

I keep getting a

GameAccountsController GET search finds a named system account directly
     Failure/Error: get(:search, name: 'test').to be_redirect_to(game_account_path('test'))
     NoMethodError:
       undefined method `to' for #<ActionController::TestResponse:0x007f8b0beb3e10>
     # ./spec/controllers/game_accounts_controller_spec.rb:6:in `block (3 levels) in <top (required)>'

can anyone please let me know what i am doing wrong ?? .. tried doing .should redirect_to and i still get the same error but with method 'should'.

Client code

module GameAccounts class GameAccountsClient

OAUTH_CONFIG=YAML.load_file(Rails.root.join('config','oauth.yml' ))
def consumer
  @consumer ||= OAuth::Consumer.new(OAUTH_CONFIG['oauth_key'],OAUTH_CONFIG['oauth_secret'],access_token_url: OAUTH_CONFIG['oauth_access_token_url'],signature_method: 'HMAC-SHA1')
end

def get_accounts_by_name(name)
   query_account(CGI.escape(name))
end

def get_accounts_by_id(account_id)
  response = query_account(CGI.escape(account_id))
  parse_json(response)
end

def get_json(limit,offset,name)

  limit=set_limit(limit)

  offset = set_offset(offset)

  query = "?name=#{CGI.escape(name)}&limit=#{limit}#{offset}"
  response = query_account(query)
  parse_json(response)
end


def parse_json(response)
   JSON.parse(response.body)
  end
end

Rspec's request specs can be tricky. You should call the 'get' method with you params, this will create a response method where your actual response data is being held:

require 'spec_helper'

describe GameAccountsController do
  describe 'GET search' do
    it 'finds a named system account directly' do
      get(:search, name: 'test')
      response.should redirect_to(game_account_path('test'))
    end
  end
end

Hope it helps :)

Edit:

Here's a link to rspec's documentation , version 2.13 supports the expect syntax. The above example could also be written as:

require 'spec_helper'

describe GameAccountsController do
  describe 'GET search' do
    it 'finds a named system account directly' do
      get(:search, name: 'test')
      expect(response).to redirect_to(game_account_path('test'))
    end
  end
end

Edit 2:

Try the following code and test the return values (and classes) of the get_* methods:

def search
  @accounts = []

  if params[:name]

    if get_response.is_a?(Net::HTTPSuccess)
      unless get_account.empty?
        session[:account] = get_account
        redirect_to game_account_path(params[:name])
      end
    end

    json = get_client.get_json(params[:limit],params[:offset],params[:name])
    @presenter = GameAccountsPresenter.new(json)

  end
end

def get_client
  @client ||= GameAccounts::GameAccountsClient.new
end

# Try and find a game account by id using the given name
def get_response
  @response ||= client.get_accounts_by_name(params[:name])
end

def get_account
  @account ||= get_client.parse_json(get_response)
end

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