我正在使用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测试失败,因为计数不会改变。
有什么好的建议吗?发生了什么事?
谢谢!
答案 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
您将看到有关用户的信息是相同的。事实上,它们不是内存中完全相同的对象实例并不重要。