Rspec+GuardでCarrierwaveを使用していると一時的にハングアップする

投稿者: Anonymous rspecをguardで自動化して実行した際に、Carrierwaveを使用した処理の実行後にrubyプロセスのCPU使用率が数十秒100%近い状態になります。 rails 4.2.0 rspec 3.2.0 guard 2.12.4 guard-rspec 4.5.0 carrierwave 0.10.0 factory_girl 4.5.0 環境は上記の通りです。 通常のコマンドからrspecを実行するとrubyプロセスのCPUの使用率はすぐに終了します。 しかしguardを使用してspecファイルの変更を検出しての実行の際には数十秒間CPUが100%近くなり、処理が止まります(次の変更の検知・実行までタイムラグがある)。 概要は以下のとおりで、 user モデル imageというattributeを持っており、mount_uploader :image, UserImageUploaderとして設定。 carrierwave 設定 CarrierWave.configure do |config| if Rails.env.production? || Rails.env.staging? config.fog_credentials = { ### } config.asset_host = Settings.asset_host config.fog_public = true config.fog_directory = Rails.application.secrets.IMAGE_BUCKET config.storage :fog else config.storage :file end if Rails.env.test?…(Continue Reading)

RSpec+CapybaraでBootstrap 4のドロップダウンをテストする方法

投稿者: Anonymous 現在、RSpec+Capybaraでテストコードを書こうとしています。 やりたいことはナビゲーションバーの中にあるドロップダウンをクリックして表示されたドロップダウンメニューの中にログアウトというコンテンツがあることを確かめることです。 Viewのコードは下記の通りです。 テンプレートエンジンはslimを、CSSフレームワークはBootstrap 4を使っています。 nav.navbar ul.navbar-left = link_to ‘brand’, authenticated_root_path, class: ‘navbar-brand’ ul.navbar-right li.nav-item.dropdown = link_to ‘☰’.html_safe, ‘http://example.com’, class: ‘nav-link dropdown-toggle’, id: ‘navbarDropdownMenuLink’, ‘data-toggle’: ‘dropdown’, ‘aria-haspopup’: ‘true’, ‘aria-expanded’: ‘false’ .dropdown-menu aria-labelledby=’navbarDropdownMenuLink’ = link_to ‘ログアウト’, destroy_user_session_path, method: ‘delete’, class: ‘dropdown-item’ 次に現状のテストコードは下記の通りです。 feature ‘Navigation links for users’, :devise do scenario ‘view navigation links’ do…(Continue Reading)

RSpecの特定のテストの時にだけbinding.pryで動作を確認する

投稿者: Anonymous RSpecのテスト中にbinding.pryで変数の状態などを確認できるようにpry-byebugを入れて使ってみたのですが、binding.pryを入れておいたメソッドが複数のテストから呼ばれていると、そのテストのたびに全て止まってしまい、何度もexitを入力しなければすべてのテストを終えれませんでした。 特定のテストでだけbinding.pryを有効にするにはどうすればよいのでしょうか? 以下に例を示しておきます。 Classファイル class Post def foo binding.pry # do something return nil end def bar # foo を呼び出して何かする end end Specファイル let(:post){ Post.create } describe “.foo” do it do expect(post.foo).to be nil end end describe “.bar” do it do expect(post.bar).to be 1 end end この時に一つ目のテストではbinding.pryで止まるけども、2つ目のテストでは止めずに処理を続行させたいと思っています。 解決 特定のテストだけを実行するとよいのではないでしょうか。 describe “.foo”, focus: true…(Continue Reading)

Capybara で XPath を用いて n 番目の要素を見つけられない

投稿者: Anonymous Pagination のテストのために、最初は以下のようなコードを書いていたのですが、一つのページ内に複数のPagination を表示するページなので、一番上のブロックのみを確認することにしました。 find(“//*[@class=’pagination’]//a[text()=’2′]”).click expect(page.status_code).to eq(200) これに、以下のように *[@class=’pagination’] の末尾に [1] を追加したのですが Capybara::ElementNotFound になってしまいます。 find(“//*[@class=’pagination’][1]//a[text()=’2′]”).click expect(page.status_code).to eq(200) Test 環境ではなく Development 環境になりますが、既に Pagination の2ページ目が存在する環境で以下のようにすれば要素を取得できることが確認できました。 doc = Nokogiri::HTML(open “http://localhost:3000/”) doc.xpath(“//*[@class=’pagination’][1]//a[text()=’2′]”) Capybara が採用している XPath と Nokogiri の XPath にはなにか違いがあるのでしょうか? clickメソッドを呼び出さないなら使える expect(page).to have_xpath(“//*[@class=’pagination’][1]//a[text()=’2′]”) という風に呼び出す場合ならエラーになりませんでした。 解決 XPathを使わなくても all を使うと簡潔に書けます。 all(‘.pagination’)[1].click_link(‘2’) allは指定したクラスに合致する全ての要素を配列して返します。なので、[1]を指定すると、2番目の pagination を取得できます。 あとは、その中にある「2」のリンクをクリックすればOKです。 試してみてください。 ちなみに僕の経験上、Capybaraを使ったテストではXPathはほとんど使いません。 Capybara標準のAPIを駆使するか、テストしやすいようにview側にclassを追加することの方が多いです。 ご参考までに。 EDIT XPathでうまくいかない原因がわかりました。…(Continue Reading)

RSpecでエラーを発生させたいのにnothing was raisedと出る

投稿者: Anonymous システムをrubyのバージョンをアップ(ruby 1.9.2p320⇒2.2.3)しました。Railsのバージョンは3.2.19 DBはMySQLを使用しています。 テストを実行したところエラーが発生し以下のようなエラーが発生しました。 Failures: 1) …の場合は、 そのまま例外をraiseする。 Failure/Error: lambda{Job.find_by_id(@conn, 0)}.should raise_error(ex) expected Unauthorized but nothing was raised プロダクトコードは以下のようでテストでmrqを実行したときに任意のエラーを発生させようとしてます。 def self.find_by_id(conn, id) options = {…} response = Job.mrq(conn, options) テストコードです。 before(:each) do Job.should_receive(:mrq).and_raise(ex) end context “…の場合は、” do let(:ex){SomeError.new(“Unauthorized”, 401)} it “そのまま例外をraiseする。” do lambda{Job.find_by_id(@conn, 0)}.should raise_error(ex) end end rspec (2.11.0)を使用してます。ruby 1.9.2では動作していました。 解決 ドキュメントに書いてあるように、raise_errorマッチャ―の引数に渡すのは例外クラスです。例外クラスのインスタンスではありません。 https://www.relishapp.com/rspec/rspec-expectations/v/2-11/docs/built-in-matchers/raise-error-matcher…(Continue Reading)

viewの埋め込みコードで発生する例外を確認する方法

投稿者: Anonymous Ruby on Rails 3.2.13 Rspec 2.14.0 こんにちは。 これまでまともにテストを書いていなかったのですが、さすがにまずいと思いRspecの勉強を始めました。 タイトルの通り、viewの中の埋め込みコードで結構な頻度で例外が発生するので、これを確認するためのテストを書きたいと思い、controllerのテストで it ‘returns status 200’ do get :show, {:id => user.id} expect(response).to be_success end としてみたところ、ブラウザ上では例外500が出ているのにも拘らず成功してしまいます。 こういった場合はどのようにテストを書くと良いのでしょうか?初歩的な質問で恐縮なのですが、Googleで調べてもなかなか欲しい情報が出てこず困っています。 どうかみなさんのお力をお貸しください。 解決 ControllerのテストなのでデフォルトではViewをレンダリングしません。 もし、View(ERB)の中でエラーが発生しているとControllerのテストはパスして、ブラウザで開くとエラー、という可能性があります。 この予想が当たっているのであれば、解決方法は二つぐらいあるかなと思います。 解決策1 Controller specでviewをレンダリングし、responseの内容を検証する。 以下のページが参考になりそうです。 https://www.relishapp.com/rspec/rspec-rails/v/2-1/docs/controller-specs/render-views 解決策2 Controller specではなくFeature specを書く。 Feature specであればブラウザ上の操作をかなりリアルにシミュレートできるので、テストはパスしてブラウザではエラーになる、という可能性が低くなります。 Feature specについては僕がQiitaに書いたこの記事が参考になるかもしれません。 http://qiita.com/jnchito/items/607f956263c38a5fec24 どちらの解決策がオススメかと言えば、僕は後者のFeature specをオススメします。 Controller specも全く書かないわけではないですが、僕の場合、書く頻度としてはModel specとFeature specの方が多いです。 なお、手前味噌になりますが、これからRSpecの勉強をするのであれば僕が翻訳した電子書籍 「Everyday Rails –…(Continue Reading)

phantomjs 2.0.0以降にするとpoltergeistでstatus_codeが304になることがある

投稿者: Anonymous poltergeist gem の 1.9.0 がリリースされて、新しい phantomjs のサポートが入ったので、 phantomjs を更新してみたところ、リダイレクトを返す URL に2回目以降に visit したときに page.status_code が 200 ではなく 304 になってしまい困っています。 具体的には https://github.com/znz/test304/blob/master/spec/features/home_spec.rb のような spec で https://github.com/znz/test304#result-with-phantomjs-200-211 のように 304 になってしまいます。 毎回 304 になったり、 js: false の時も 304 になるのなら spec の方を書き換えれば良いのですが、単独で実行した時には 200 なので書き換えるわけにもいかずにどうすれば良いのか困っているのですが、どうすれば良いのでしょうか? 解決 phantomjs 2.1.1 では 1.9.8 では送信されなかった If-None-Match が送信されるようになっていて、Rack::ConditionalGet と Rack::ETag で 304 Not…(Continue Reading)

RequestSpecでContent-Typeヘッダapplication/jsonをデフォルトにするには?

投稿者: Anonymous Web APIでのデータの送受信形式にJSONを使用し、リクエストのContent-Typeヘッダをapplication/jsonに指定する場合、RequestSpecで以下のように書いてます。 しかし、この書き方だとspecファイル毎にlet(:request_header)の記入が必要なため、DRYじゃないし、面倒です。 これをデフォルト設定にする、もしくは汎用的に書く方法を知っている方いたら教えて下さい。 describe ‘Users’ do let(:request_header) do { ‘CONTENT_TYPE’ => ‘application/json’, ‘ACCEPT’ => ‘application/json’ } end describe ‘POST /api/v1/users’ do it ‘creates a new user’ do params = FactoryGirl.attributes_for(:user) expect { post ‘/api/v1/users’, params.to_json, request_header }.to change { User.count }.from(0).to(1) expect(response.status).to eq(201) end end end 解決 下記のissueでも同じような質問が挙げられていますが、完全な自動化は難しいようですね。 ability to add header…(Continue Reading)

Rspecでcan’t convert RSpec::Mocks::Double to Arrayエラーが出る

投稿者: Anonymous Rails4.0に上げてRspec2.99にしたところテストでエラーが出るようになりました。 エラー。, can’t convert RSpec::Mocks::Double to Array (RSpec::Mocks::Double#to_ary gives RSpec::Mocks::Double) 2015/11/25 15:31:39 [INFO] :: /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/form_options_helper.rb:347:in `Array’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/form_options_helper.rb:347:in `block in options_for_select’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/form_options_helper.rb:346:in `map’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/form_options_helper.rb:346:in `options_for_select’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/tags/select.rb:22:in `render’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/form_options_helper.rb:156:in `select’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/form_options_helper.rb:774:in `select’ /poge/hoge/workspace/version/app/pogeapp/app/helpers/common_form_builder.rb:157:in `block in select_frame’ Rspecをバージョンアップすれば解決するのでしょうか? selectボックスを表示する箇所でエラーが出るようになりました。実際に表示してもエラーにはなりません。 実コードデバックしたやつです。listsに配列を入れてセレクトボックスで出そうとしてるだけです。 157 select(:hogeid, lists, options, {:class => span12}) + (byebug) p lists [Hoge:0x3fcd6a333844 @name=”Hoge_11″] (byebug) p options…(Continue Reading)

Rails4でsporkを起動できない

投稿者: Anonymous Rails3.2からRails4.0最新バージョンに上げたところsporkを起動できなくなりました。 以下のようなエラーが出ます。 [[email protected] apll]$ sudo bundle exec spork Using RSpec, Rails Preloading Rails environment Loading Spork.prefork block… cannot load such file — spec_helper (LoadError) /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activesupport-4.0.13/lib/active_support/dependencies.rb:229:in `require’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activesupport-4.0.13/lib/active_support/dependencies.rb:229:in `block in require’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activesupport-4.0.13/lib/active_support/dependencies.rb:214:in `load_dependency’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activesupport-4.0.13/lib/active_support/dependencies.rb:229:in `require’ /poge/hoge/workspace/version/app/hogeapp/spec/support/lib/cached_object_loader_examples.rb:18:in `<top (required)>’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activesupport-4.0.13/lib/active_support/dependencies.rb:229:in `require’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activesupport-4.0.13/lib/active_support/dependencies.rb:229:in `block in require’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activesupport-4.0.13/lib/active_support/dependencies.rb:214:in `load_dependency’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activesupport-4.0.13/lib/active_support/dependencies.rb:229:in `require’ /poge/hoge/workspace/version/app/hogeapp/spec/spec_helper.rb:31:in `block (2 levels) in <top…(Continue Reading)

Oauthでの認証をRspecの統合テストで確認する方法

投稿者: Anonymous Railsでログイン管理にFacebookのOAuthでの認証を使っているのですが、それに対するテストを書くことがうまくできず躓いています。ネット上にいくつか情報はあったのですが古いものも錯綜しておりどれに従えば良いのかわかりませんでした。 出来る所までやったのを書かせてもらいますと spec/support/omniauth.rb def set_omniauth OmniAuth.config.test_mode = true OmniAuth.config.add_mock(:facebook, {uid: ‘123545’, name: ‘foo bar’}) end spec/requests/authentication_spec.rb require ‘rails_helper’ describe ‘authentication’ do before do set_omniauth Rails.application.env_config[“devise.mapping”] = Devise.mappings[:user] Rails.application.env_config[“omniauth.auth”] = OmniAuth.config.mock_auth[:facebook] visit ‘/users/auth/facebook?user_type=host’ end it ‘Facebookから承認OK’ do expect(page).to have_content ‘Facebook から承認されました。’ end end としているのですが、テストには以下のエラーで失敗します。 expected #has_content?(“Facebook から承認されました。”) to return true, got false spec/spec_helper.rbでadd_mockを使うサンプルなどもありましたが 公式のWikiと…(Continue Reading)

rspec uninitialized constant Event (NameError)

投稿者: Anonymous rspecを実行しようとすると以下のエラーが出ます /Users/(user_name)/rails_projects/(project_name)/spec/models/event_spec.rb:3:in `<top (required)>’: uninitialized constant Event (NameError) 以下spec/models/event_spec.rbです。 require ‘spec_helper’ describe Event do descrive ‘#name’ do context ‘空白の時’ do it ‘valid でないこと’ do event = Event.new(name: ”) event.valid? expect(event.errors[:name]).to be_present end end end end NoNameErrorと出ていますが、Eventモデルは作成済みです。 rails_helper.rb,spec_helper.rb共にデフォルトの状態ですが、何か追加で記述する必要があるのでしょうか。よろしくお願いいたします。 解決 rspec-rails 3系をお使いであることを前提に回答します。 spec/models/event_spec.rbの1行目にある require ‘spec_helper’をrequire ‘rails_helper’とすれば動くと思います。 rspec-rails 3からspec_helperの代りにrails_helperをrequireすることになりました。 参考 https://github.com/rspec/rspec-rails/blob/v3.4.0/README.md#upgrade-note 回答者: Anonymous

Rspecのフィーチャーテストが失敗したりしなかったり

投稿者: Anonymous ローカルの環境で単体でのテストの場合はパスするのですが、 一括でのテストの場合に、たまにエラーになるケースがあります。 環境は下記のような感じです。 ruby 2.1.3 rails 4.1.8 rspec 3.1.0 rspec-core-3.1.7 capybara-2.4.4 poltergeist-1.5.1 phantomjs 1.9.8 config.order = ‘random’にしています。 randomでない場合に一括実行すると必ずエラーになるのでrandomにしています。 テストコードは、具体的には以下。その他にも同じようにランダムにエラーになる箇所があります。 scenario ‘顧客を新規追加する’, js: true do visit new_customer_path tab = first(‘#new_customer’) # Ambiguous match by rack_test within tab do fill_in ‘customer_name’, with: ‘customer’ end expect { click_button I18n.t(‘helpers.submit.create’) }.to change(Customer, :count).by(1) end エラー内容は、他のケースでも以下のような感じです。 このようなケースに陥った方アドバイスをお願いします。 その他、色々と調べた結果、Ajax使用箇所では、以下のようなスニペットを用いたりしてみましたが・・…(Continue Reading)

RSpecでの「dependent: destoy」のテストにてエラー:「バリデーションに失敗しました」の解消方法について

投稿者: Anonymous 解決したいこと rspec実行時、下記のエラーが出てテストが失敗になります。こちらのエラー解決方法についてお伺いしたいです。 「これっぽい」といったような、推測される原因レベルのご回答でも大変有難いため、お願いしたく存じます。 Failures: 1) User dependent: destoy destroys all posts when deleted Failure/Error: 2.times { FactoryBot.create(:post, user: user) } ActiveRecord::RecordInvalid: バリデーションに失敗しました: Create userを入力してください 「Create userを入力してください」と出ていますが、 FactoryBotで作成したuserを使っているため、userは作成されていると考えておりました。 アソシエーションを伴うFactoryBotでのテストデータの作成方法が誤っているのではないかと 推測しています。 並行して「アソシエーションを伴うFactoryBotでのテストデータの作成方法」を調べているのですが、エラーの解消方法が見当たらず、お伺いしたい次第です。 現状 ログインユーザの情報を格納するuserモデルの単体テストを実施しようとしています。 <対象テストコード(models/user_spec.rb)> require ‘rails_helper’ RSpec.describe User, type: :model do let(:user) { FactoryBot.create(:user) } # 削除の依存関係 describe "dependent: destoy" do # 削除すると、紐づく店舗も全て削除されること it…(Continue Reading)

letのスコープについて

投稿者: Anonymous こういうクラスがあったとして、 class Book attr_reader :author end 以下のspecを書くと、 let(:author){ build :author, name: ‘田中’} it ‘test_a’ do book = Book.new book.instance_eval do @author = author end expect(book.author.name).to eq ‘田中’ end undefined method or variables ‘name’ for nil class になってしまいます。 しかし、 let(:author){ build :author, name: ‘田中’} it ‘test_a’ do # 一度ローカル変数に代入する。 var_author = author book =…(Continue Reading)

Basic認証時、specファイルを作成してください。

投稿者: Anonymous Ruby on Railsで開発をしています。 現在、scaffoldで簡単な管理画面を作成しています。 中身はほぼ終わり、管理画面全体にbasic認証をかけましたが、その後、scaffoldで自動的に生成されてたspecファイルの内容がパスできなくなりました。 Basic認証時にテストをパスさせるために必要なことは何か、コードでわかりやすく教えていただきたいです。 あと、specファイルを書くのが難しいですので、参考できるサイトなどもお勧めしていただければと思います。 以下は現在自分のspecファイルです。 spec/requests/admin_companies_spec.rb require ‘rails_helper’ RSpec.describe ‘Admin::Companies’, type: :request do describe ‘GET /admin_companies’ do it ‘works! (now write some real specs)’ do get companies_path expect(response).to have_http_status(200) end end end 必要なファイルとファイルの中身を詳細にお願いします。 解決 どのようなコードになっているのかわからないので、的確なアドバイスは出来かねますが、テストのみbasic認証をパスさせるのであれば、環境を見てbasic認証する・しないを判定してはどうでしょうか。特にご自身で修正を加えていなければ、テスト(rake spec)はRAILS_ENV=testで動作しているかと思いますので、認証部分は以下のようになるかと思います。 def basic_authenticate return true Rails.env.test? # testの場合は一律trueを返す # test以外の場合はbasic認証を実施する authenticate_or_request_with_http_basic do |user, pass| user…(Continue Reading)

RSpec3.3 で it を 一行で記述する方法

投稿者: Anonymous rspec 3.3 を使いテストを書いていたのですが、シンプルなテストだったので it “condition1” do expect{foo[:hoge}.eq 1 end it “condition2” do expect{foo[:moge}.eq 2 end をそれぞれ一行で it “condition1″{ expect{foo[:hoge}.eq 1 } it “condition2″{ expect{foo[:moge}.eq 2 } と書いた所 syntax error, unexpected ‘{‘, expecting keyword_end (SyntaxError) のエラーになってしまいました。do ~ end と { ~ } は等価だと思っていたのですがRSpecでは違うのでしょうか? 何かRSpecのオプションなどによって一行での記述を行えるようにすることはできますか? 解決 Rubyの仕様で、メソッドに引数と中括弧のブロックを同時に渡す場合はメソッドを丸括弧で囲む必要があります。 他にも同じようなパターンを下にまとめてみました。 # 引数あり、丸括弧なし、中括弧ブロックあり => NG irb(main):001:0> puts ‘x’…(Continue Reading)

RSpecのフィーチャースペックでメソッドのスタブ化ができない

投稿者: user31137 プロジェクトを管理するサンプルアプリケーションを題材にRSpecの勉強をしています。 サンプルアプリケーションは、プロジェクトを登録することができ、そのプロジェクトは完了済みかどうかのステータス(boolean型のcompleted)を持っています。 プロジェクトの詳細画面には、完了ボタンがあり、完了ボタンを押すと、ステータスが完了済みになります。 この完了ボタンを押すときの、完了処理が失敗したときのフィーチャースペックを書いています。 models/project.rb class Project < ApplicationRecord def complete_pj update_attributes(completed: true) end end controllers/projects_controller.rb class ProjectsController < ApplicationController def complete if @project.complete_pj redirect_to @project, notice: “Congratulations, this project is complete!” else redirect_to @project, alert: “Unable to complete project.” end end end spec/features/projects_spec.rb require ‘rails_helper’ RSpec.feature “Projects”, type: :feature do scenario “ユーザはプロジェクトを完了済みにする(しかし失敗する)”…(Continue Reading)

Deviceを使用したアプリで、Rspecを用いてテストする場合

投稿者: Anonymous 初めて、Deviceを使用したアプリで、Rspecを用いてテストしようとしています。 はじめにコントローラーのテストファイルに、以下を追加して、正常なレスポンスが帰ってくるかのテストをしようとしています。 it “returns a 200 response” do get :index expect(response).to have_http_status “200” end その結果、以下のようなエラーが出ました。 Devise::MissingWarden: Devise could not find the `Warden::Proxy` instance on your request environment. Make sure that your application is loading Devise and Warden as expected and that the `Warden::Manager` middleware is present in your middleware stack. If you are…(Continue Reading)

shared_examplesはrspec3.0から使えない?

投稿者: Anonymous rspec2.99でinclude_examplesを使用しています。 spechoge.rb describe ‘hoge_type’ do before do end include_examples ‘toarutesuto’ end spec/support/lib/kyouyuu.rb require ‘spec_helper’ describe “テストを共有” do before do end shared_examples ‘toarutesuto’ do before do end it” do end テストを実行すると、以下ワーニングが出ます。 Deprecation Warnings: ——————————————————————————– Accessing shared_examples defined across contexts is deprecated. Please declare shared_examples within a shared context, or at the top level. This…(Continue Reading)

rspec2.99からrspec3.0.1に上げたらundefined method `gsub’ for nil:NilClassエラー発生

投稿者: Anonymous rspec2.99でテストが全部OKになった状態でrspec3.0.1に上げたら以下エラーが出るようになりました。 2015/12/08 10:36:23 [ERROR] :: ref:[e92-35e1] type:[APPLICATION_ERROR] システムエラー。, undefined method `gsub’ for nil:NilClass 2015/12/08 10:36:23 [INFO] :: /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/activesupport-4.0.13/lib/active_support/core_ext/string/output_safety.rb:24:in `html_escape’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/tags/text_field.rb:10:in `render’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/form_helper.rb:771:in `text_field’ /poge/hoge/.rbenv/versions/2.2.3/gemsets/4.0/gems/actionpack-4.0.13/lib/action_view/helpers/form_helper.rb:1262:in `text_field’ /poge/hoge/workspace/transpec4.0/app/views/hogehoges/_form.html.erb:119:in `block (4 levels) in _app_views_hogehoges__form_html_erb__287475598865390515_70183742838460′ エラーが出ている箇所のform.html.erbはテキストを表示しようとしています。 <%= f.text_field :hoge_memo, :placeholder => t(‘.input.hoge_memo’) %> テストコードはレスポンスを正常なことを確認しており、mock1にhoge_memoを定義するとエラーは出なくなりました。が、同じようにエラーになっている箇所が多くあり全部定義する以外に修正方法は無いでしょうか? – let(:p1){{:name => “hoge”}} + let(:p1){{:name => “hoge”, :hoge_memo=>3,:dispname => “hogehoge”}} let(:mock1) do…(Continue Reading)

RSpecでスクレイピングのテストをする時のHTMLファイルの置き場所

投稿者: Anonymous 特定のページをスクレイピングして解析するスクリプトをRubyで書いているのですが、 このスクリプトのテストをRSpecで書く時にどこにHTMLファイルを置いて、 どうspecファイルから呼び出すのが正しいのでしょうか? Rails環境ではななくフレームワークなしのRubyのコードで以下の様な構成です。 foo.rb foo/sub_class.rb spec/foo_spec.rb spec/spec_helper.rb spec/foo/sub_class_spec.rb 追記 具体的にはSelenium::WebDriver.forで生成した driver を Foo::SubClassが受け取り、解析をするためにNokogiriに @driver.page_sourceで渡しています。 (上ではSubClassと書いていたのですが、ここではBarにしてます。) class Foo::Bar attr_accessor :driver def initialize(code: code, driver: driver) @code = code @driver = driver end def doc Nokogiri::HTML(@driver.page_source) end end ですので、ここで受け取る@driver.page_sourceをFile.readで保存していたHTMLからの読み込みで差し替えたいのですがうまく行きませんでした。ファイルの読み込み自体はできていますので配置ではなくallowの使い方の問題だと思うので、そちらについてはもう少し調べてみます。 ファイルの読み込み方に問題があれば指摘をよろしくお願いします。 require ‘spec_helper’ describe Foo::Bar do let(:bar){ Foo::Bar.new(code: 1, driver: nil) } describe “driver#page_source” do…(Continue Reading)

railsのsystem testでheadless_chromeを使いたい

投稿者: Anonymous 現在、Ubuntuのdocker上にrails 5.1.7の開発環境を構築しています。 そしてその上でjsを含んだViewテストをする為に、system testのテスト環境を構築しているのですが、インストールと設定が上手くいかずに困っています。 まずエラー内容を説明させていただきます。 rspec spec/views/hoge/index_spec.rb このコマンドを実行すると、 ArgumentError: unknown driver: :headless_chrome というエラーが出ます。 私はネットの記事で調べheadless_chromeでテストする為にrails_helper.rbに対して以下の行を追加しました。 config.before(:each) do |example| if example.metadata[:type] == :system driven_by :selenium, using: :headless_chrome, screen_size: [1400, 1400] end end またdocker上のubuntuにchromedriverをインストールしました。 # chromedriver –version ChromeDriver 76.0.3809.68 (420c9498db8ce8fcd190a954d51297672c1515d5-refs/branch-heads/[email protected]{#864}) どの様にすればこのエラーを解決できるでしょうか? ご回答いただけると助かります。 解決 ドライバの指定がrailsのバージョンで異なるようです。 以下のようにするとどうでしょうか? driven_by :selenium_chrome_headless, screen_size: [1400, 1400] 参考 https://qiita.com/jnchito/items/c7e6e7abf83598a6516d#%E3%83%98%E3%83%83%E3%83%89%E3%83%AC%E3%82%B9%E3%83%A2%E3%83%BC%E3%83%89%E3%81%AEchrome%E3%81%A7%E5%AE%9F%E8%A1%8C%E3%81%99%E3%82%8B 回答者: Anonymous

Rspecのmodelテストで、user_id: nil, post_id: nilになってしまう。

投稿者: Anonymous 現在railsでRspecテストを作成中です。 factory_bot_railsのGemを使用しています。 おそらくfactory_bot_railsを使用しての、データの作成方法に間違いがあると思われるんですが、 今回の場合、どうすればpostとuser、そしてcommentとpostとuserを紐付ける事が出来るのでしょうか? ご教授頂ければ幸いです。 [factories/posts.rb] FactoryBot.define do factory :post do association :user img { Rack::Test::UploadedFile.new(Rails.root.join(“spec/img/people.jpg”)) } trait :created_at_5_years_ago do created_at { 5.year.ago } end trait :created_at_1_year_ago do created_at { 1.year.ago } end trait :created_at_1_week_ago do created_at { 1.week.ago } end trait :created_at_1_day_ago do created_at { 1.day.ago } end end end [models/post_spec.rb] require…(Continue Reading)

rails runnerで作られたバッチのspecによるテスト方法

投稿者: Anonymous Railsプロジェクト上で、rails runnerを使って、以下にバッチを作ったとします。 lib/tasks/hogehoge.rb このファイルをrspecを使ってテストしたい場合、 どのパスに どうやって 記述をしたらよいでしょうか、ご回答宜しくお願い致します。 解決 僕だったらロジックの大半をクラスメソッドに書いて、そのクラスをテストします。 テスト容易性を重視した実装にする、というアプローチです。 # lib/tasks/hogehoge.rb Hoge.do_something # app/models/hoge.rb class Hoge < ActiveRecord::Base def self.do_something # … end end # spec/models/hoge_spec.rb describe Hoge do describe ‘::do_something’ do it ‘does something’ do expect(Hoge.do_something).to blah blah… end end end ちなみにEveryday Rails – RSpecによるRailsテスト入門の第10章でもこのアプローチが紹介されています。 ご参考までに。 回答者: Anonymous

factory_girlでhas_manyを作る

投稿者: Anonymous factory_girlでpogepoge:hoge 1:nの関係を作ろうとしてます。 下記のように作成したのですが FactoryGirl.define do factory :pogepoge do association :user, factory: :user hoge 1 birthday Date.today – 20.year after(:create) do |pogepoge| create(:hoge, pogepoge: pogepoge) end end end 下記validationでエラーになってしまいます。 def hoge_exist if hoge.blank? errors.add(:hoge, :no_hoge) end end エラーにしない方法を知りたいです。 エラー内容は以下のような形で出ます。 ActiveRecord::RecordInvalid: translation missing: ja.activerecord.errors.messages.record_invalid # /Users/hoge/.rbenv/versions/2.2.4/gemsets/ruby224/gems/factory_girl-4.5.0/lib/factory_girl/configuration.rb:14:in `block in initialize’ # /Users/hoge/.rbenv/versions/2.2.4/gemsets/ruby224/gems/factory_girl-4.5.0/lib/factory_girl/evaluation.rb:15:in `[]’ # /Users/hoge/.rbenv/versions/2.2.4/gemsets/ruby224/gems/factory_girl-4.5.0/lib/factory_girl/evaluation.rb:15:in `create’…(Continue Reading)

has_manyのクラスのインスタンスをRSpecで呼び出す

投稿者: Anonymous RailsでCompanyクラスがPastDataをhas_manyで持つ関係において 下記のようなコードを書いたのですが describe Company do describe “exmaple test” do let(:company){ Company.create } context “fooが10の時” do let(:past_data){ company.past_data.build(foo: 10) } it “barは20” do expect(company.past_data_bar).to eq(20) end end end end app/models/company.rb def past_data_bar past_data.bar end 以下のように NoMethodErrorになってしまいます。 NoMethodError: undefined method `bar’ for nil:NilClass company.past_dataがnilになっているのが原因なのはわかるのですが、解決方法がわかりませんでした。 company.past_data.barと呼び出していますが、実際のコードではCompanyクラスの内部メソッドでpast_dataを呼び出しています。 RSpecでhas_manyの関係にあるクラスを呼び出しているメソッドのテストはどのように書けば良いのでしょうか? 解決 company.past_dataにすると、letで宣言したオブジェクトが呼ばれないので、expectの中はpast_dataだけにしてみてください。 describe Company do describe “exmaple test” do…(Continue Reading)

rspec-railsでgemのgeocoderをテストしたい

投稿者: Anonymous railsアプリでrspecを使って、gemのgeocoderで取得した住所と緯度経度をテストしたいと思っています。 # Gemfile gem ‘geocoder’ gem ‘gmaps4rails’ # pin.rb geocoded_by :address after_validation :geocode, if: :address_changed? Pinにはlatitudeとlongitudeがあります。 下がschemeのPinです。 create_table “pins”, force: :cascade do |t| t.string “pin_name” t.string “address” t.decimal “latitude”, precision: 23, scale: 20 t.decimal “longitude”, precision: 23, scale: 20 t.text “description” t.integer “user_id” t.datetime “created_at”, null: false t.datetime “updated_at”, null: false t.index [“user_id”],…(Continue Reading)

RSpecテストでrailsの設定を変更して、後でもとに戻したい

投稿者: Anonymous やりたいこと:RSpecのテストの途中でrailsの設定を変更して、後でもとに戻したい 例えば、特定の用途のメール送信に使う独自のdelivery_methodを作ってあって、特定のテスト内ではこれを有効にしてテストしたい、という場合。 最初のアイデア context ‘my_super_methodを使うケース’ do before do ActionMailer::Base.delivery_method = :my_super_method end after do ActionMailer::Base.delivery_method = :test end it ‘my_super_methodはxxな振る舞いをする’ do # my_super_methodを使ったふるまいのテスト end end 問題  ActionMailer::Base.delivery_methodが:testであることを前提にしている。もしこれが他の値になっていたら、他のテストの挙動を壊してしまう 次のアイデア  テスト実行前の ActionMailer::Base.delivery_method を保存しておきます context ‘my_super_methodを使うケース’ do __keeped_method = nil before do __keeped_method = ActionMailer::Base.delivery_method ActionMailer::Base.delivery_method = :my_super_method end after do ActionMailer::Base.delivery_method = __keeped_method end it…(Continue Reading)