我试图断言在某个控制器动作上调用一次实例方法。该测试由于某种原因不起作用。代码确实按照预期行事。
我正在使用Rspec 1.x和factory_girl
测试
context 'as a regular API user' do
before do
login_as_regular_user
Feed.superfeedr_api.stub!(:pingable?).and_return(true)
@feed_entry = Factory(:feed_entry)
post :read, :id => @feed_entry.id, :format => 'json'
end
it "should call read_by method once" do
@user = Factory.create(:user)
controller.stub!(:current_account).and_return(@user.account)
@feed_entry.should_receive(:read_by).once
post :read, :id => @feed_entry.id, :format => 'json'
end
it { should respond_with(204)}
it { should assign_to(:feed_entry).with(@feed_entry) }
it { should respond_with_content_type(/json/) }
end
控制器
# POST /entries/1234/read - mark as read
# DELETE /entries/1234/read - mark as unread
def read
if request.post?
@feed_entry.read_by(current_account)
elsif request.delete?
@feed_entry.unread_by(current_account)
end
respond_to do |format|
format.html { redirect_to topic_path(params[:topic_id]) }
format.json { render :nothing => :true, :status => :no_content }
format.plist { render :nothing => :true, :status => :no_content }
end
end
错误
1)
Spec::Mocks::MockExpectationError in 'FeedEntriesController.read as a regular API user should call read_by method once'
#<FeedEntry:0x107db8758> expected :read_by with (any args) once, but received it 0 times
./spec/controllers/feed_entries_controller_spec.rb:82:
Finished in 2.242711 seconds
25 examples, 1 failure, 3 pending
答案 0 :(得分:2)
我猜你有一些代码(在示例中未显示)通过id找到FeedEntry并将其分配给@feed_entry:
# controller
@feed_entry = FeedEntry.find(params[:id])
需要存根,以便find方法返回工厂实例:
# spec
FeedEntry.should_receive(:find).and_return(@feed_entry)
当测试代码和规范中的实例变量名称具有相同的名称时,可能会造成混淆 - 不要忘记它们是不同的对象。