rspec / Devise / current_user - 错误的用户实例(控制器规范)

时间:2014-06-26 16:30:55

标签: ruby-on-rails rspec devise controllers

我正在使用RSpec来测试我的嵌套控制器。我已经登录了current_user(在我的情况下是成员),它正在返回一个不同的实例。请参阅以下内容:

规范摘要:

before :each do
    @request.env["devise.mapping"] = Devise.mappings[:member]
    @member = create(:member)
    sign_in @member
    @calendar = @member.calendars.create!({"name" => "test"}, Calendars::Native)
end

it "creates a new Event" do
    puts "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    puts @member
    puts @calendar
    puts @calendar.events.count
    puts "->->->->->->->->->->->->->->->->->->->->->->->->->->->-"

    post :create, {:native_id => @calendar.id, :event => valid_attributes}, valid_session

    puts "<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<"
    puts @member
    puts @calendar
    puts @calendar.events.count
    puts "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

    expect {
      post :create, {:native_id => @calendar.to_param, :event => valid_attributes}, valid_session
    }.to change(@calendar.events, :count).by(1)  #Event, :count).by(1)
end

Controller Snippet

def create
    set_calendar
    @event = @calendar.events.build(event_params) 
    respond_to do |format|
        if @event.save
            puts "DID SAVE"
            puts @member
            puts @calendar
            puts @event

            format.html { redirect_to native_event_url(:native_id => @calendar.id, :id => @event.id), notice: 'Event was successfully created.' }
            format.json { render action: 'show', status: :created, location: @event }
        else
            format.html { render action: 'new' }
            format.json { render json: @event.errors, status: :unprocessable_entity }
       end
    end
  end

  def set_calendar
       @member = current_member
       @calendar = @member.calendars.find(params[:native_id])
  end

控制台输出:

xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
#<Member:0x007fb5a6e4fda0>
#<Calendars::Native:0x007fb5a495bf58>
0
->->->->->->->->->->->->->->->->->->->->->->->->->->->-
DID SAVE
#<Member:0x007fb5a49a1aa8>
#<Calendars::Native:0x007fb5a49a0810>
#<Event:0x007fb5a49b3eb0>
<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<-<
#<Member:0x007fb5a6e4fda0>
#<Calendars::Native:0x007fb5a495bf58>
0
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

正如您所看到的......成员objectId不同,导致Rspec测试失败,因为计数不会改变。

有什么好的建议吗?发生了什么事?

谢谢!

1 个答案:

答案 0 :(得分:1)

这很好。你只是有点困惑。

首次创建@member时,它会存储在内存中。它具有对象ID X.然后,在您的实际控制器中,数据从current_user方法中获取,即使它与@member具有相同的基础数据,它实际上是内存中的不同对象,因此它具有对象ID Y.您的测试持有一个对象,您的代码持有另一个对象。

不要执行puts @member,而是尝试puts @member.inspect,或作为捷径p @member。这将显示更多信息。您可能会得到这样的输出:

XXXXXXXXXXX
#<Member id: 1, :name "John Doe">
->->->->->->
DID SAVE
#<Member id: 1, :name "John Doe">
<-<-<-<-<-<-
#<Member id: 1, :name "John Doe">
XXXXXXXXXXXX

您将看到有关用户的信息是相同的。事实上,它们不是内存中完全相同的对象实例并不重要。