断言在控制器中调用一次实例方法

时间:2011-04-20 23:54:46

标签: ruby-on-rails ruby rspec

我试图断言在某个控制器动作上调用一次实例方法。该测试由于某种原因不起作用。代码确实按照预期行事。

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

1 个答案:

答案 0 :(得分:2)

我猜你有一些代码(在示例中未显示)通过id找到FeedEntry并将其分配给@feed_entry:

# controller
@feed_entry = FeedEntry.find(params[:id])

需要存根,以便find方法返回工厂实例:

# spec
FeedEntry.should_receive(:find).and_return(@feed_entry)

当测试代码和规范中的实例变量名称具有相同的名称时,可能会造成混淆 - 不要忘记它们是不同的对象。