我使用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
您将看到关于用户的信息是相同的。它们在内存中不是完全相同的对象实例这一事实并不重要。