私はRspec DSLに本当に苦労しています! 私は SO やインターネット上で多くのことを読んでいるので、私の弱い心が解決策にたどり着けないため、特定の問題を投稿しています。
ユーザーの電子メールを更新する post メソッドをコントローラーに用意します。正常に動作しますが、取得しているのは NilClass の未定義のメソッドだけであるため、仕様に苦労しています (すべてのオブジェクトとメソッドなどをスタブ化しようとしましたが)。
users_controller.rb
def update_user_email
@user = User.find_by_id(params[:id])
new_email = params[:user][:new_email].downcase.strip
user_check = User.find_by_email('new_email')
if user_check.blank?
@user.email = new_email
@user.save
flash[:notice] = "Email updated to #{new_email}"
else
flash[:alert] = "This email is already being used by someone else!"
end
respond_with @user do |format|
format.html { redirect_to admin_user_path(@user) }
format.json { head :no_content }
end
end
これが私が書こうとしている仕様です。これではない場合、どのテストを作成する必要があり、NilClass エラーで未定義のメソッドを防ぐために何ができるでしょうか!
users_controller_spec.rb
describe Admin::UsersController do
let!(:user) { FactoryGirl.create(:user, password: 'oldpass', email: 'bar@foo.com') }
...
describe "admin actions for each user" do
it "resets user email" do
post :update_user_email, {user: {new_email: 'foo@bar.com'} }
response.status.should == 200
end
end
...
end
そしてエラー:
Admin::UsersController admin actions for each user resets user email
Failure/Error: post :update_user_email, {user: {new_email: 'foo@bar.com'} }
NoMethodError:
undefined method `email=' for nil:NilClass