質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

919閲覧

[Rspec]post後に生成される変数の値を指定したい

yoshiky

総合スコア105

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2017/08/08 21:37

編集2017/08/09 03:12

お世話になっております。
Rspecでfeatureテストを書いているのですが、エラー発生の確認のために次のような事をしたいと思っています。
環境

  • ruby: 2.1
  • rails: 4.2系
  • rspec: 3系

ruby

1scenario 'エラー画面に遷移する事' do 2 # hoge画面に遷移した際に@hogeがnilだった場合、エラー画面に遷移する 3 visit hoge_path 4 @hoge = nil # 実際はここでnilを代入しても、visitの処理は終わっているため if @hoge.nil?の判定はtrueにならない 5 expect(page).to have_content 'unexpected error' 6end

ruby

1 2def hoge 3 @hoge = get_some_data 4 raise 'unexpected error' if @hoge.nil? # raiseでエラー画面に遷移するものとする 5 ... 6end 7

上記はイメージですが、外部からのパラメタに依らずに生成される変数@hogeに、任意の値を代入する事は可能なのでしょうか。よろしくお願いいたします。

追記

※例が不適切で知りたいことと異なっていたので、もう少し実際に即した形を提示します※

上記例では@hogeのようにインスタンス変数にしてますが、実際はcookieの値です。
[要件]

  • あるcookieの値を暗号化して保存している
  • 取得時に復号化して取り出している
  • この復号化に失敗した場合nilが返るので、例外判定したい

ruby

1 2def hoge 3 get_cookie # before_actionなどで実行されるものと想定 4 ... 5end 6 7private 8def get_cookie 9 cookie_hoge = DummyUtil.decrypt(cookie[:hoge]) #不正な値で復号化に失敗するとnilが返る 10 raise 'unexpected cookie value' if cookie_hoge.nil? 11 ... 12end

もはやprivateメソッド内の処理なのでmodelなりcontrollerの単体テストで確認すべきかも知れませんが、「cookieの復号化に失敗した場合はエラー画面に遷移すること」というfeatureテストを書く方法があれば、ご教示頂きたいです。よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

モックを使えばよさそうです。わかりやすいモックの説明

allow(@hoge).to receive(:get_some_data).and_return(nil)

【追記】
featureテストでcookieに任意の値をいれたいって事ですね。
capybara使ってるならdriverごとに方法が変わります。自分の環境では以下で出来ました

ruby

1#Capybara::RackTest 2Capybara.current_session.driver.browser.rack_mock_session.set_cookie "hoge=xxx"

投稿2017/08/08 22:48

編集2017/08/09 05:50
hellomartha

総合スコア329

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshiky

2017/08/09 03:15

ご回答ありがとうございました。 こちらの例が悪く、知りたいことと乖離していたので、質問に追記いたしました。 モックを使った実装も試してみましたが、インスタンス変数でないためか、cookieの場合は動作しませんでした。別案があれば、アドバイス頂けるとありがたいです。
yoshiky

2017/08/09 08:37

追記、ありがとうございます。 おっしゃる通りCapybaraを使っております。ご提示いただいたset_cookieでそれらしき値はセットされましたが、(Capybara.current_session.driver.browser.rack_mock_session.cookie_jar で確認)実装上のcookie[:hoge]の値は変わらないため raiseが発生する条件となりませんでした。 またspec内では page.driver.request.cookies['hoge'] でも中身が確認できたのですが、任意にセットした値には変わりませんでした。 page.driver.response.set_cookies('hoge','xxxx') でセットしてもNGでした。 セットするタイミングが悪いのかも知れません。visitの後だと処理が終わってしまっているので、直前にセットしているのですが、、 試行錯誤してみます。ありがとうございました。
yoshiky

2017/08/12 03:11

返答が遅くなって大変失礼いたしました。 例が間違っておりました。controllerでは cookies[:hoge] で値を取得していました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問