2011-04-20 58 views
1

我试图断言在某个控制器操作上调用实例方法一次。由于某种原因,测试不起作用。该代码确实做到了它应该做的。断言在控制器中调用一次实例方法

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

回答

2

我猜你有一些代码(这不是笑在本例中WN),通过ID找到FeedEntry并赋予它@feed_entry:

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

需要存根,以便查找方法返回你的工厂实例:

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

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

+0

辉煌,不知何故,我没有看到这个明显的问题。谢谢。 – brupm 2011-04-21 15:56:38

相关问题