Утверждают, что экземпляр метода вызывается один раз в контроллере - PullRequest
1 голос
/ 21 апреля 2011

Я пытаюсь утверждать, что метод экземпляра вызывается для определенного действия контроллера один раз.Тест не работает по какой-то причине.Код действительно делает то, что должен.

Я использую Rspec 1.x и factory_girl

Test

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 Ответ

2 голосов
/ 21 апреля 2011

Я предполагаю, что у вас есть код (который не показан в примере), который находит FeedEntry по идентификатору и присваивает его @feed_entry:

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

Это нужно указать, чтобы метод find возвратил ваш экземпляр фабрики:

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

Может быть непонятно, когда имена переменных экземпляра в тестируемом коде и в спецификации имеют одинаковые имена - не забывайте, что это разные объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...