rspec рельсы насмешливый хэш сессии - PullRequest
8 голосов
/ 12 сентября 2010

Я пытаюсь смоделировать хэш сессии для контроллера следующим образом:

it "finds using the session[:company_id]" do
  session.should_receive(:[]).with(:company_id).and_return 100
  Company.should_receive(:find).with(100)
  get 'show'
end

Когда я вызываю get 'show', он сообщает:

received :[] with unexpected arguments  
expected: (:company_id)  
   got: ("flash")

Код контроллера выглядиткак:

def show
  company_id = session[:company_id]
  @company = Company.find params[company_id]
end

Я также просто попытался установить

it "finds using the session[:company_id]" do
  session[:company_id]= 100
  Company.should_receive(:find).with(100)
  get 'show'
end

, но затем возник вопрос:

expected: (100)
got: (nil)

У кого-нибудь есть идеи, почему?

Ответы [ 4 ]

5 голосов
/ 17 февраля 2012

Я только что столкнулся с этим.Мне не удалось получить must_receive, чтобы не мешать работе с флэш-памятью.

Но это позволило мне проверить поведение, которое я искал:

it "should redirect to intended_url if set" do
  request.env['warden'] = double(:authenticate! => true)
  session.stub(:[]).with("flash").and_return double(:sweep => true, :update => true, :[]= => [])
  session.stub(:[]).with(:intended_url).and_return("/users")
  post 'create'
  response.should redirect_to("/users")
end

Надеюсь, это поможет ...

3 голосов
/ 18 ноября 2013

Я не мог понять, как смоделировать сам контейнер сеанса, однако в большинстве случаев достаточно просто передать данные сеанса с запросом.Таким образом, тест будет разбит на два случая:

it "returns 404 if company_id is not in session" do
  get :show, {}, {}
  response.status.should == 404 # or assert_raises depending on how you handle 404s
end

it "finds using the session[:company_id]" do
  Company.should_receive(:find).with(100)
  get :show, {}, {:company_id => 100}
end

PS: забыл упомянуть, что я использую несколько настроенных помощников из этого фрагмента .

0 голосов
/ 11 января 2012

попробуйте это:

session.expects(:[]).with(has_entries('company_id' => 100))
0 голосов
/ 12 сентября 2010

Это потому, что вы получаете флэш-сессию с вашего контроллера.Так определите это.Flash сохраняется в сеансе.

it "finds using the session[:company_id]" do
  session.stub!(:[]).with(:flash)
  session.should_receive(:[]).with(:company_id).and_return 100
  Company.should_receive(:find).with(100)
  get 'show'
end
...