【问题标题】:rspec / Devise / current_user - wrong user instance (controller spec)rspec / Devise / current_user - 错误的用户实例(控制器规范)
【发布时间】:2014-06-26 16:30:55
【问题描述】:

我正在使用 RSpec 来测试我的嵌套控制器。我已经登录了 current_user (在我的例子中是成员),它正在返回一个不同的实例。请看下面:

规格sn-p:

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

控制器片段

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

如您所见... Member objectId 不同,导致 Rspec 测试失败,因为 count 没有改变。

有什么好的建议吗?怎么回事?

谢谢!!

【问题讨论】:

  • 我忘了说我正在使用 MongoId 并且事件嵌入在日历中。可能这就是Event, :count 不起作用的原因。

标签: ruby-on-rails rspec devise controllers


【解决方案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

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

【讨论】:

  • 谢谢 MrDanA...你是对的...如果我检查它们,ID 是相同的。现在的问题是......为什么 calendar.events.count 不会改变?我应该得到一个新的日历实例吗?非常感谢!!
  • 当您在expect 中调用@calendar.events 时,我认为是缓存导致@calendar 对象,所以它没有看到它发生变化。当您期望 Event, :count 改变时,它是否有效?另外,尝试用@calendar.reload 重新加载@calendar
  • 不... expect{...}.to change(Event, :count).by(1) 也不起作用。我会尝试重新加载日历,但规范开始变得丑陋! ;-)
  • 我不知道与 Mongold 的区别。解决此问题的另一种方法(在我看来更好)是在您发送创建对象的请求后,明确检查它。尝试找到事件,然后检查其每个属性以确保它们都已保存。
猜你喜欢
  • 2015-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多