いくつかの仕様を書いているときにエラーが発生しました
QuestionsController GET #edit finds question to edit
Failure/Error: Question.should_receive(:find).with("#{question.id}").and_return(question)
(<Question(id: integer, title: string, body: text, created_at: datetime, updated_at: datetime, user_id: integer, up_votes: integer, down_votes: integer) (class)>).find("9")
expected: 1 time
received: 2 times
class QuestionsController < ApplicationController
def edit
@question = Question.find(params[:id])
end
end
仕様/コントローラー/questions_spec.rb
describe QuestionsController do
describe 'get edit' do
it 'finds question to edit' do
question = create(:question)
user = create(:user)
sign_in user
Question.should_receive(:find).and_return question
get :edit, :id => question.id
end
it 'renders edit template' do
question = create(:question)
user = create(:user)
sign_in user
Question.stub(:find).and_return question
get :edit, :id => question.id
expect(responce).to render_template 'edit'
end
end
end
Rspec、Factory Girl、database_cleaner、Postgres を使用しています
spec_helper の database_cleaner 設定
config.before(:suite) do
DatabaseCleaner.clean_with :truncation
DatabaseCleaner.strategy = :transaction
end
config.before(:each) do |group|
# The strategy needs to be set before we call DatabaseCleaner.start
DatabaseCleaner.strategy = :transaction
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
config.use_transactional_fixtures = false
編集アクションをテストしています。最初の例で find を受け取り、2 番目にスタブの find メソッド呼び出しを受け取るように Question に期待を設定します。最初の例でエラーが発生しました。これら 2 つの例は互いに完全に分離されていないと思います。