読者です 読者をやめる 読者になる 読者になる

rspec

factory girlでnamespaceのあるモデルのfactoryを生成する

ActsAsTaggableOnのデータを生成したかったのですが、namespaceがあるために生成できませんでした。 そんな時の技です。 FactoryGirl.define do factory :tag, class: ActsAsTaggableOn::Tag do |f| f.name '脈あり' end end 公式にもっといいのがありました…

shared_examples_forに引数を渡して処理をさらにまとめる

ここ最近はリファクタリングやより短い書き方を考えてます。 一行でもコードから文字が減るのは嬉しい。 そんなわけで、カラム名が違うだけで、内容同じじゃん・・・って場合のテストの書き方です。 前提条件 カラムの:login, :passwordは半角英数字のみで文…

rspecのテストが読まれない原因

原因はファイル名が間違えています。 bundle exec rspec -fd -c spec/controllers/ →読まれないテストがある bundle exec rspec -fd -c spec/controllers/hoge_controller.rb →読み込まれる ファイル名が間違えているという現実 bundle exec rspec -fd -c sp…

webmockでサイト先のデータをstub化する

人のサイトからスクレイピングをしていて、データを毎回テストしている際に、サイトの内容が変更される場合があります。 予期せぬ不具合に対処が打てなくなるので、サイトの内容をstub化してくれるgemがあります。 GitHub - bblimke/webmock: Library for st…

rspecのletの注意事項

rspecでletを使うとインスタンス変数を使わずにアクセスできるので便利です。 ただし、注意事項があります。 それは、遅延評価されるということです。 describe 'DELETE #destroy' do let(:contact) do create(:contact, firstname: 'Lawrence', lastname: '…

rspecで関連するモデルもfactoryで簡単に同時に生成する方法

rspecで関連するモデルを同時に生成する方法があります。 下記のような所有関係を持っていたとします。 class User < ActiveRecord::Base has_many :posts end class Post < ActiveRecord::Base belongs_to :user end Factoryの書き方です FactoryGirl.defin…

rspecをshared_examples_forでまとめる

rspecで共通項があった場合、shared_examples_forでまとめることができます。 使い方 下記のようなmoduleがあったとします。 app/models/concerns/body_validators.rb module BodyValidators extend ActiveSupport::Concern included do validates :body, pr…

rspecのassigns(変数名)に値を渡す方法

rspecのcontrollerでassigns(変数名)で値を受け渡すことができると書かれたいたのに、全く値を渡すことができませんでした。 原因がわかりました。 書き方 Post controllerがあったとします app/controllers/post_controllers.rb def index @posts = Post.al…

FactoryGirlのassociationをつけなくてもモデル間を関連づけする方法

FactoryGirlでモデルの関連づけをする場合は、associationを使ったりします。 ただし、なんでもassociationを使うと、テストが多くなるにつれて、テストが壊れやすくなります。 関連づけをする書き方は他にもあります。 associationのあり/なしの書き方を見…

rspecのbefore :each doについて

rspecの書き方で、beforeの書き方で:eachをつけていることがあります。 何か違いがあるのでしょうか?という備忘録です。 before :each do @smith = Contact.create( firstname: 'john', lastname: 'Smith', email: 'jsmith@example.com' ) @jones = Contact…

capybaraでbutton・form以外の要素をクリックさせる方法

ボタンは使わないけど、クリックさせて何かのアクションを起こさせるときに使う方法です。 よく、click_on click_buttonを使うと思うのですが、それ以外の場合ですね。 find('#hoge').click このfindで要素を探させて、その要素をクリックさせることができま…

capyabaraで要素が重なった時に、最初のものをクリックする方法

capybaraを使っていると、ボタンをクリックするのに要素が重なったりする時があります。 例えば、こんな感じのエラーですね。 Failure/Error: click_on 'コメント' Capybara::Ambiguous: Ambiguous match, found 3 elements matching link or button "コメン…

rspecのAjax対応で、capybara-webkit-の反応を待たせる方法

rspecでAjax対応をテストしているときに、capybara-webkitを使用している場合に、クリックした反応を待たずにそのまま次のテストにいってしまい、テストが失敗してしまうことがあります。 それを防ぐための方法になります。 test_helperのdefault値に反応を…

RSpecで独自matcherを作成してみよう

RSpecを使っていて、minitestならできるmatcherが、RSpecにはないってことがあります。 例えば、統合テストでflashの有無を確認する場合 minitest asset flash.empty? RSpec expect(page).to have_selector '.alert' こんな感じになるかと思います。 flashの…