rspec / design / current_user语言 - 错误的用户实例(控制器规格)



我使用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

控制器片段

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测试失败,因为count没有改变。

有什么好的建议吗?这是怎么呢

谢谢! !

这很好。你只是有点糊涂了。

当您第一次创建@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

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

最新更新