2011-03-27 2 views
2

Использование Rails 3.0.5, RSpec 2 и Capybara 0.4.1.2, и я пытаюсь написать спецификацию контроллера для своего нового сеанса SessionController #.Rspec и Capybara соответствует объекту

it "assigns the empty session to a variable" do 
    get :new 
    assigns(:session).should == ActiveRecord::Base::Session.new 
end 

Я использую ActiveRecord :: Base пространство имена, как это, кажется, вступает в противоречие с классом Капибара Session, когда у меня нет.

Вот SessionsController:

class SessionsController < ApplicationController 
    def new 
    @session = Session.new 
    end 
end 

RSpec, кажется, не понимают, это одни и те же объекты. Вот что возвращает мой тест:

Failure/Error: assigns(:session).should == ActiveRecord::Base::Session.new 
    expected: #<Session id: nil, session_id: nil, data: nil, created_at: nil, updated_at: nil> 
     got: #<Session id: nil, session_id: nil, data: nil, created_at: nil, updated_at: nil> (using ==) 
    Diff: 
# ./spec/controllers/sessions_controller_spec.rb:17:in `block (3 levels) in <top (required)>' 

Любые подсказки?

ответ

3

Проблема заключается в том, что если вы

ActiveRecord::Base::Session.new == ActiveRecord::Base::Session.new 

Вы получили бы ложным, так как оба эти объекты имеют отдельный object_id.

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

assigns(:session).should be_an(ActiveRecord::Base::Session) 
+0

Спасибо, это работает. Из любопытства ... изменилось бы, если я буду использовать 'be_an' или' be_an_instance_of' здесь? – Cimm

+0

Ах да. 'be_an' проверяет' kind_of? 'и' be_an_instance_of' проверяет 'instance_of?'. Таким образом be_an также будет истинным для каждого экземпляра любого класса, который наследуется от AR :: Base :: Session. Дополнительная информация: http://stackoverflow.com/questions/3893278/ruby-kind-of-vs-instance-of-vs-is-a – Dogbert

+0

Прохладный, спасибо за ответ! – Cimm

Смежные вопросы