Domanda

Sto cercando di spegnere un metodo sul mio current_user (utilizzando una soluzione di autenticazione restful_authentication modificato) con RSpec. Io sono completamente sicuro di come posso accedere a questo metodo in mie specifiche del controller. current_user di per sé non funziona. Ho bisogno di ottenere il controller stesso prima? Come posso fare questo?

Utilizzando rails 2.3.5, rspec 1.3.0 e rspec-rails 1.3.2

# my_controller_spec.rb
require 'spec_helper'

describe MyController do

  let(:foos){ # some array of foos }

  it "fetches foos of current user" do
    current_user.should_receive(:foos).and_return(foos)
    get :show
  end
end

Produce

NoMethodError in 'ChallengesController fetches foos of current user'
undefined method `current_user' for #<Spec::Rails::Example::ControllerExampleGroup::Subclass_1::Subclass_1::Subclass_2::Subclass_2:0x7194b2f4>
È stato utile?

Soluzione

RSpec-rails ti dà un metodo controller per l'utilizzo negli esempi di controller. Quindi:

controller.stub!(:current_user).with(:foos).and_return(foos)

dovrebbe funzionare.

Altri suggerimenti

come può sapere dove trovare current_user? questo dovrebbe risolverlo:

subject.current_user.should_receive(:foos).and_return(foos)

Non sono del tutto familiarità con restful_authentication, solo Authlogic e mettere a punto, ma probabilmente è simile a quella current_user è un metodo di controllo e non un oggetto, che è il motivo per chiamare should_receive su di esso non funziona come previsto (sei impostazione un'aspettativa sull'oggetto che current_user ritorna , ma il metodo non è accessibile all'interno del campo di applicazione della vostra aspettativa).

Prova questo:

stub!(:current_user).and_return(foos)

Ho letto questo e la mia ottimizzato un po '. Se si vuole semplicemente passare un oggetto utente nel tuo test Rspec, è possibile utilizzare questo:

  1. In primo luogo, creare un oggetto utente all'interno del test RSpec. Per esempio: (Uso qualunque attributi avete bisogno o è necessario creare l'oggetto utente.)

    user = User.create (nome: "ted")

    . (Nota: è possibile utilizzare anche una fabbrica da factorygirl)

  2. Ora, con quello oggetto utente che viene salvato nella "utente" variabile, fare questo all'interno di quella stessa prova Rspec:

    controller.stub! (: Current_user) .and_return (utente)

che dovrebbe funzionare ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top