Тестирование модели с RSpec2, возвращающей 0 элементов без тела ответа - PullRequest
0 голосов
/ 28 декабря 2011

Я пытаюсь создать API с Rails, используя BDD с RSpec.Версия Rails - 3.1.1, версия Ruby - 1.9.2, версия Devise - 1.5.3, версия rspec - 2.7.0.Я относительно новичок в Rails и очень плохо знаком с RSpec.

Я определил простой RSpec следующим образом для тестирования FormsController практически без логики.

describe FormsController, " handling GET /forms" do
  include Devise::TestHelpers
  render_views

  before do        
    user = Factory.create(:user) # Handle Devise authentication
    user.confirm!
    sign_in user

    @form = mock_model(Form)
    Form.stub!(:all).and_return([ @form ])
  end

  it "gets successfully" do
    get :index, :format => :json
    response.should be_success
  end

  it "finds all forms" do
    Form.should_receive(:all).and_return([@form])
    get :index, :format => :json
    Rails.logger.info "*** response.body="+response.body
  end
end

Код контроллера формы очень проств настоящее время.

class FormsController < ApplicationController
  before_filter :authenticate_user!

  # GET /forms
  # GET /forms.json
  def index
    @forms = Form.find_all_by_owner_id(current_user.id)

    respond_to do |format|
      format.html # index.html.erb
      format.json { render :json => @forms }
    end
  end
end

Когда я запускаю спецификацию, "находит все формы" всегда терпит неудачу с

 Failure/Error: Form.should_receive(:all).and_return([@form])
   (<Form(id: integer, title: string, owner_id: integer, created_at: datetime, updated_at: datetime) (class)>).all(any args)
       expected: 1 time
       received: 0 times

Выходные данные из log / test.log показывают:

*** response.body=[]

Почему?Я чувствую, что проблема связана с Form.stub!(:all).and_return([ @form ]), но я не уверен, как отлаживать.

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 28 декабря 2011

find_all_by_owner_id не совпадает с Form.all. find_all_by_owner_id заканчивает тем, что делал

Form.where(...).all

, что не соответствует ожиданиям, которые вы установили. В вашем конкретном случае я бы сказал should_receive, что я жду звонка на find_all_by_owner_id, а не all.

0 голосов
/ 31 декабря 2011

После гораздо большего количества проб и ошибок у меня сработало следующее решение.

  • Я перешел с насмешливой модели Form на использование Factory Girl для создания полной модели
  • Затем я обновил тест, чтобы использовать to_json для сравнения ответа с моделью.

Спецификация следующая.

describe FormsController, " handling GET /forms" do
  include Devise::TestHelpers
  render_views

  before do        
    user = Factory.create(:user) # Handle Devise authentication
    user.confirm!
    sign_in user

    @form1 = Factory.create(:form)
  end

  it "gets successfully" do
    get :index, :format => :json
    response.should be_success
  end

  it "finds all forms" do
    get :index, :format => :json
    response.body.should == [ @form1 ].to_json
    Rails.logger.info "*** response.body="+response.body
  end
end
0 голосов
/ 28 декабря 2011

Это поможет опубликовать код вашего контроллера (который тестируется). Ошибка говорит о том, что декларация Form.should_receive(:all).and_return([@form]) не была удовлетворена. Объявление гласит, что у вас должен быть такой код в действии вашего контроллера: Form.all.

...