Code Monkey home page Code Monkey logo

everydayrails-rspec-jp-2022's Introduction

RSpec

Everyday Rails Testing with RSpec sample application (2022 Japanese edition)

Sample Rails application for Everyday Rails Testing with RSpec: A Practical Approach to Test-driven Development by Aaron Sumner. This repository is the official fork for the 2022 Japanese edition.


このリポジトリのRailsアプリは「 Everyday Rails - RSpecによるRailsテスト入門 」のサンプルアプリケーションです。

2022年更新の日本語版より、 原著のソースコード をフォークし、日本語版独自にメンテナンスしていくことになりました。

cover image

このリポジトリでは既存のアプリケーションに対して、少しずつテストを追加していく過程を説明します。最初はまったくテストのないコードベースから始まり、 モデルスペック、コントローラスペック、システムスペック、リクエストスペックと順に進みます。

このリポジトリの各ブランチを開くと、各章で追加したコードが確認できます。詳しくは本書の第1章をご覧ください。

Gitを使うとブランチ名を指定して各バージョンをチェックアウトできます。詳しくは本書をご覧ください。

Gitが苦手な方は、GitHubの便利な ブランチ機能を利用してください。 フィルターで特定のブランチを選択し、オンラインでソースコードをブラウズすることができます。

Gitについてもっと詳しく知りたい方は、無料で公開されている「 Git Immersion 」または「 Try Git 」(いずれも英語版)がお勧めです。

everydayrails-rspec-jp-2022's People

Contributors

junichiito avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

everydayrails-rspec-jp-2022's Issues

9章内のfocusタグの付いたexampleのみをテストする設定について

9章の「速くテストを書き、速いテストを書く」で学んだことがありましたのでお知らせします。

focusタグの付いたexampleのみをテストする設定をしたいと思い、PDF版の175ページ一番上のコードspec/spec_helper.rbを見ながら、

image

該当のファイルを開いてみましたところ、下記のスクショのように1行で設定されたコードがありました(下線部分)。
このコメントアウトを外して実行してみたら、focusタグの付いたexampleのみのテストができました。

image

スクール内の学習中だったためメンターさんに伺ったところ、 filter_run_when_matching は 3.5 で追加されたオプションで config.filter_runconfig.run_all_when_everything_filtered を両方設定してくれるとのことでした。
https://github.com/rspec/rspec-core/blob/main/Changelog.md#350beta3--2016-04-02

確認のため、書籍のP175と同じように設定しても、focusタグの付いたexampleのみをテストすることができました。
修正が必要かどうかの判断はつかなかったのですが、お知らせのみさせていただきます。

ご確認をよろしくお願いします🙇🏻‍♀️

11章内のサンプルコードspec/system/projects_spec.rbにlogin_asヘルパーが残っている

本書の変更履歴の239ページ(PDF版)で下記のように書かれていました。

第11章
• Warden が提供しているlogin_as ヘルパーを、Devise が提供しているsign_in ヘルパー
に変更。

203ページのspec/system/projects_spec.rbではsign_in ヘルパーを使ったsign_in userに変更されていますが、
206ページと213ページの同ファイルの同部分はlogin_as user, scope: :userのままのようです。

お手数ですがご確認いただけますと幸いです。よろしくお願いします🙇🏻‍♀️

スクショを添付いたします。


  • 203ページ・・・sign_in ヘルパーに変更できている
    image

  • 206ページ・・・login_as ヘルパーのまま
    image

  • 213ページ・・・login_as ヘルパーのまま
    image

`bin/setup` を実行すると、`db/schema.rb` が更新される

概要

git clone 後、main ブランチで bin/setup を実行すると db/schema.rb が更新され、以下のような差分が発生しました

urimaro/everydayrails-rspec-jp-2022@a87355f

このまま進めることはできますが、気になったので報告いたしました
私の環境の問題でしょうか?

再現手順

git clone https://github.com/JunichiIto/everydayrails-rspec-jp-2022.git
cd everydayrails-rspec-jp-2022
bin/setup

環境

  • Ruby 3.1.0
  • Rails 7.0.2.3

7章リクエストスペックでAPIをテスト - GETリクエストをテストするでも記述ミスについて

概要

たいしたミスではないのですが😅、コードではなく本書の方でタイポを発見したので報告します。
7章「リクエストスペックでAPIをテスト」の「GETリクエストをテストする」で見てみましょう見てましょうとなっています。(スクリーンショット参考)

該当箇所のスクリーンショット

image

ご確認ください🙇‍♂️

Better Specsの日本語翻訳ページについて

[Rails のテストに関するさらなる情報源]->[Better Specs]の説明に
[訳注: Better Specs には日本の翻訳ページもあります]とありますが、見当たりませんでした。
現在も存在しますか?(検索不足でしたらすみません・・・)

2014, 2015年頃の記事には以下のURLが登場しますが、現在404です。
https://www.betterspecs.org/jp/

8章スペックをDRYに保つ、カスタムマッチャ内の記述について

こんにちは。コードの内容ではありませんが、本書の記述についてタイポかなと思うところがありましたのでお知らせします。
PDF版だと147ページ、第8章スペックをDRYに保つ、カスタムマッチャ内で「期待しまします。」が「期待します。」だと思いました。
スクリーンショットを添付します。よろしくお願いします🙏
image

5章「コントローラースペック - ユーザー入力をテストする」サンプルコードの修正

以下のFactoryのサンプルコードは中括弧({})が必要ではないかと思い、Issueとして登録しました。
報告する場所として適切でなかったり、思い違いがありましたらご指摘いただけますと幸いです🙇🏻‍♂️

# spec/factories/projects.rb
FactoryBot.define do
  ...

  trailt :invalid do
-   name nil
+   name { nil }
  end
end

参考:
修正前の状態でのエラーメッセージ

  1) ProjectsController#create as an authenticated user with invalid attributes does not add a project
     Failure/Error: project_params = FactoryBot.attributes_for(:project, :invalid)
     
     KeyError:
       Trait not registered: "name" referenced within "invalid" definition
     # ./spec/controllers/projects_controller_spec.rb:81:in `block (5 levels) in <top (required)>'
     # ------------------
     # --- Caused by: ---
     # KeyError:
     #   Trait not registered: "name" referenced within "invalid" definition
     #   ./spec/controllers/projects_controller_spec.rb:81:in `block (5 levels) in <top (required)>'

ご確認よろしくお願いいたします🙏

11章「テスト駆動開発に向けて - 外から中へ進む」サンプルコードの訂正

節の最後に載っているapp/controllers/projects_controller.rbのサンプルコード内でupdate_attributesを使用していますが、Rails 6.1で削除済みのメソッドのため、正しくはupdateではないかと思いました。
以下の画像の赤線の部分です。

スクリーンショット 2022-01-28 15 45 12

GitHub上のサンプルコードの方はupdateになっていました。

def complete
if @project.update(completed: true)
redirect_to @project,
notice: "Congratulations, this project is complete!"
else

ご確認いただけますと幸いです 🙏

`bundle exec rspec` を実行すると `ActiveRecord::EnvironmentMismatchError` が発生する

概要

bundle exec rspec を実行すると ActiveRecord::EnvironmentMismatchError が発生します
だだし、specは最後まで実行されます

再現手順

書籍の以下の説明に従ってセットアップすると再現します

    1. イントロダクション - サンプルアプリケーションのセットアップ手順

具体的なコマンドは以下のとおりです

git clone https://github.com/JunichiIto/everydayrails-rspec-jp-2022.git
cd everydayrails-rspec-jp-2022
rbenv local 3.1.0
bin/setup
bundle exec rspec

SSHではなくHTTPSを使っていますが、特別な理由はありません

実際の挙動

実行時のログを添付します(※)

※ issueに貼り付けると期待した通りに改行されなかったので…

回避方法

メッセージ通り、以下のコマンドを実行すると、エラーが発生しなくなります

bin/rails db:environment:set RAILS_ENV=test

環境

  • Ruby 3.1.0
  • Rails 7.0.4
  • mainブランチ

その他

以下のissueと同じ現象だと思うのですが、すでに対策はmergeされているようなので、なぜ発生するのかよくわかっていません

Railsをアップグレードすると発生する可能性があるのかもしれないですね…
完全に推測です

テストを実行するとWebdrivers::VersionErrorが発生する

$ bundle exec rspec

HomeController
  returns a 200 response
  #index
    responds successfully

NotesController
  #index
    searches notes by the provided keyword

ProjectsController
  #index
    as an authenticated user
      responds successfully
    as a guest
      returns a 302 response
      redirects to the sign-in page
  #show
    as an authorized user
      responds successfully
    as an unauthorized user
      redirects to the dashboard
  #create
    as an authenticated user
      with valid attributes
        adds a project
      with invalid attributes
        does not add a project
    as a guest
      returns a 302 response
      redirects to the sign-in page
  #update
    as an authorized user
      updates a project
    as an unauthorized user
      does not update the project
      redirects to the dashboard
    as a guest
      returns a 302 response
      redirects to the sign-in page
  #destroy
    as an authorized user
      deletes a project
    as an unauthorized user
      does not delete the project
      redirects to the dashboard
    as a guest
      returns a 302 response
      redirects to the sign-in page
      does not delete the project
  #complete
    as an authenticated user
      an unsuccessful completion
        redirects to the project page
        sets the flash
        doesn't mark the project as completed

TasksController
  #show
    responds with JSON formatted output
  #create
    responds with JSON formatted output
    adds a new task to the project
    requires authentication

GeocodeUserJob
  calls geocode on the user

UserMailer
  welcome_email
    sends a welcome email to the user's email address
    sends from the support email address
    sends with the correct subject
    greets the user by first name
    reminds the user of the registered email address

Note
  is valid with a user, project, and message
  is invalid without a message
  has one attached attachment
  delegates name to the user who created it
  search message for a term
    when a match is found
      returns notes that match the search term
    when no match is found
      returns an empty collection

Project
  is expected to validate that :name is case-sensitively unique within the scope of :user_id
  can have many notes
  late status
    is late when the due date is past today
    is on time when the due date is today
    is on time when the due date is in the future

Task
  is valid with a project and name
  is invalid without a project
  is invalid without a name

User
  has a valid factory
  is valid with a first name, last name and email, and password
  is expected to validate that :first_name cannot be empty/falsy
  is expected to validate that :last_name cannot be empty/falsy
  is expected to validate that :email cannot be empty/falsy
  is expected to validate that :email is case-insensitively unique
  returns a user's full name as a string
  sends a welcome email on account creation
  performs geocoding

Home page
  responds successfully

Projects API
  loads a project
  creates a project

Projects
  as an authenticated user
    with valid attributes
      adds a project
    with invalid attributes
      does not add a project

Notes
  user uploads an attachment

Projects
  user creates a new project
  user completes a project

Sign in
  user signs in

Sign-ups
  user successfully signs up

Tasks
  user toggles a task (FAILED - 1)

Failures:

  1) Tasks user toggles a task
     Got 0 failures and 2 other errors:

     1.1) Failure/Error: visit root_path
          
          Webdrivers::VersionError:
            Unable to find latest point release version for 115.0.5790. You appear to be using a non-production version of Chrome. Please set `Webdrivers::Chromedriver.required_version = <desired driver version>` to a known chromedriver version: https://chromedriver.storage.googleapis.com/index.html
          # ./spec/system/tasks_spec.rb:24:in `go_to_project'
          # ./spec/system/tasks_spec.rb:14:in `block (2 levels) in <main>'
          # ------------------
          # --- Caused by: ---
          # Webdrivers::NetworkError:
          #   Net::HTTPClientException: 404 "Not Found" with https://chromedriver.storage.googleapis.com/LATEST_RELEASE_115.0.5790
          #   ./spec/system/tasks_spec.rb:24:in `go_to_project'

     1.2) Failure/Error: raise VersionError, msg
          
          Webdrivers::VersionError:
            Unable to find latest point release version for 115.0.5790. You appear to be using a non-production version of Chrome. Please set `Webdrivers::Chromedriver.required_version = <desired driver version>` to a known chromedriver version: https://chromedriver.storage.googleapis.com/index.html
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/chromedriver.rb:83:in `rescue in latest_point_release'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/chromedriver.rb:65:in `latest_point_release'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/chromedriver.rb:39:in `block in latest_version'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/common.rb:166:in `with_cache'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/chromedriver.rb:37:in `latest_version'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/common.rb:122:in `download_version'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/common.rb:126:in `download_url'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/common.rb:98:in `update'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/chromedriver.rb:156:in `block in <main>'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver/common/service.rb:99:in `binary_path'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver/common/service.rb:73:in `initialize'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver/common/service.rb:32:in `new'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver/common/service.rb:32:in `chrome'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver/common/driver.rb:340:in `service_url'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver/common/driver.rb:321:in `create_bridge'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver/common/driver.rb:74:in `initialize'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver/common/driver.rb:47:in `new'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver/common/driver.rb:47:in `for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/selenium-webdriver-4.7.1/lib/selenium/webdriver.rb:88:in `for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/capybara-3.38.0/lib/capybara/selenium/driver.rb:83:in `browser'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/capybara-3.38.0/lib/capybara/selenium/driver.rb:161:in `save_screenshot'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/capybara-3.38.0/lib/capybara/session.rb:747:in `block in save_screenshot'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/capybara-3.38.0/lib/capybara/session.rb:747:in `save_screenshot'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/actionpack-7.0.4/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb:99:in `save_image'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/actionpack-7.0.4/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb:36:in `take_screenshot'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/actionpack-7.0.4/lib/action_dispatch/system_testing/test_helpers/screenshot_helper.rb:45:in `take_failed_screenshot'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/actionpack-7.0.4/lib/action_dispatch/system_testing/test_helpers/setup_and_teardown.rb:8:in `before_teardown'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-rails-6.0.1/lib/rspec/rails/example/system_example_group.rb:110:in `call'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-rails-6.0.1/lib/rspec/rails/example/system_example_group.rb:110:in `block (2 levels) in <module:SystemExampleGroup>'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:457:in `instance_exec'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:457:in `instance_exec'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:372:in `run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:529:in `block in run_owned_hooks_for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:528:in `each'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:528:in `run_owned_hooks_for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:615:in `block in run_example_hooks_for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:614:in `each'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:614:in `run_example_hooks_for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:485:in `run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:518:in `run_after_example'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:283:in `block in run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:511:in `block in with_around_and_singleton_context_hooks'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:468:in `block in with_around_example_hooks'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:486:in `block in run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:626:in `block in run_around_example_hooks_for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:352:in `call'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-rails-6.0.1/lib/rspec/rails/example/system_example_group.rb:120:in `block (2 levels) in <module:SystemExampleGroup>'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:457:in `instance_exec'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:457:in `instance_exec'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:390:in `execute_with'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:628:in `block (2 levels) in run_around_example_hooks_for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:352:in `call'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-rails-6.0.1/lib/rspec/rails/adapters.rb:75:in `block (2 levels) in <module:MinitestLifecycleAdapter>'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:457:in `instance_exec'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:457:in `instance_exec'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:390:in `execute_with'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:628:in `block (2 levels) in run_around_example_hooks_for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:352:in `call'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:629:in `run_around_example_hooks_for'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/hooks.rb:486:in `run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:468:in `with_around_example_hooks'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:511:in `with_around_and_singleton_context_hooks'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example.rb:259:in `run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example_group.rb:646:in `block in run_examples'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example_group.rb:642:in `map'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example_group.rb:642:in `run_examples'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/example_group.rb:607:in `run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/runner.rb:121:in `block (3 levels) in run_specs'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/runner.rb:121:in `map'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/runner.rb:121:in `block (2 levels) in run_specs'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/configuration.rb:2070:in `with_suite_hooks'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/runner.rb:116:in `block in run_specs'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/reporter.rb:74:in `report'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/runner.rb:115:in `run_specs'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/runner.rb:89:in `run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/runner.rb:71:in `run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/lib/rspec/core/runner.rb:45:in `invoke'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/rspec-core-3.12.0/exe/rspec:4:in `<top (required)>'
          # /Users/jnito/.rbenv/versions/3.2.0/bin/rspec:25:in `load'
          # /Users/jnito/.rbenv/versions/3.2.0/bin/rspec:25:in `<top (required)>'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/cli/exec.rb:58:in `load'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/cli/exec.rb:58:in `kernel_load'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/cli/exec.rb:23:in `run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/cli.rb:492:in `exec'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/cli.rb:34:in `dispatch'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/cli.rb:28:in `start'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/exe/bundle:45:in `block in <top (required)>'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/lib/bundler/friendly_errors.rb:117:in `with_friendly_errors'
          # /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/bundler-2.4.7/exe/bundle:33:in `<top (required)>'
          # /Users/jnito/.rbenv/versions/3.2.0/bin/bundle:25:in `load'
          # /Users/jnito/.rbenv/versions/3.2.0/bin/bundle:25:in `<main>'
          # 
          #   Showing full backtrace because every line was filtered out.
          #   See docs for RSpec::Configuration#backtrace_exclusion_patterns and
          #   RSpec::Configuration#backtrace_inclusion_patterns for more information.
          # ------------------
          # --- Caused by: ---
          # Webdrivers::NetworkError:
          #   Net::HTTPClientException: 404 "Not Found" with https://chromedriver.storage.googleapis.com/LATEST_RELEASE_115.0.5790
          #   /Users/jnito/.rbenv/versions/3.2.0/lib/ruby/gems/3.2.0/gems/webdrivers-5.2.0/lib/webdrivers/network.rb:19:in `get'

Finished in 10.9 seconds (files took 1.35 seconds to load)
70 examples, 1 failure

Failed examples:

rspec ./spec/system/tasks_spec.rb:12 # Tasks user toggles a task

クローン直後のセットアップ後に rspec が落ちてしまう

はじめまして

電子書籍を購入後、環境セットアップして bundle exec rspec を main ブランチで実行しましたが落ちてしまいました。

ご確認頂けますでしょうか?

実行結果を以下に記載します

Tasks
2023-11-03 19:46:52 INFO Selenium [:logger_info] Details on how to use and modify Selenium logger:
  https://selenium.dev/documentation/webdriver/troubleshooting/logging

2023-11-03 19:46:52 WARN Selenium [:selenium_manager] The chromedriver version (106.0.5249.21) detected in PATH at /home/ys-office-llc/.local/bin/chromedriver might not be compatible with the detected chrome version (117.0.5938.92); currently, chromedriver 117.0.5938.149 is recommended for chrome 117.*, so it is advised to delete the driver in PATH and retry 
2023-11-03 19:46:53 WARN Selenium [:selenium_manager] The chromedriver version (106.0.5249.21) detected in PATH at /home/ys-office-llc/.local/bin/chromedriver might not be compatible with the detected chrome version (117.0.5938.92); currently, chromedriver 117.0.5938.149 is recommended for chrome 117.*, so it is advised to delete the driver in PATH and retry 
  user toggles a task (FAILED - 1)

Failures:

  1) Tasks user toggles a task
     Got 0 failures and 2 other errors:

     1.1) Failure/Error: visit root_path
          
          Selenium::WebDriver::Error::SessionNotCreatedError:
            session not created: This version of ChromeDriver only supports Chrome version 106
            Current browser version is 117.0.5938.92 with binary path /opt/google/chrome/google-chrome
          # #0 0x560f4c89b343 <unknown>
          # #1 0x560f4c6a554a <unknown>
          # #2 0x560f4c6ced82 <unknown>
          # #3 0x560f4c6ca53d <unknown>
          # #4 0x560f4c6c6256 <unknown>
          # #5 0x560f4c704af6 <unknown>
          # #6 0x560f4c70445f <unknown>
          # #7 0x560f4c6fca73 <unknown>
          # #8 0x560f4c6d14f3 <unknown>
          # #9 0x560f4c6d2731 <unknown>
          # #10 0x560f4c8e962e <unknown>
          # #11 0x560f4c8ecac2 <unknown>
          # #12 0x560f4c8cff4e <unknown>
          # #13 0x560f4c8ed743 <unknown>
          # #14 0x560f4c8c436f <unknown>
          # #15 0x560f4c90da28 <unknown>
          # #16 0x560f4c90dba6 <unknown>
          # #17 0x560f4c927d52 <unknown>
          # #18 0x7f8e7aa94ac3 <unknown>
          # ./spec/system/tasks_spec.rb:24:in `go_to_project'
          # ./spec/system/tasks_spec.rb:14:in `block (2 levels) in <main>'

     1.2) Failure/Error: Unable to infer file and line number from backtrace
          
          Selenium::WebDriver::Error::SessionNotCreatedError:
            session not created: This version of ChromeDriver only supports Chrome version 106
            Current browser version is 117.0.5938.92 with binary path /opt/google/chrome/google-chrome
          # #0 0x560f4c89b343 <unknown>
          # #1 0x560f4c6a554a <unknown>
          # #2 0x560f4c6ced82 <unknown>
          # #3 0x560f4c6ca53d <unknown>
          # #4 0x560f4c6c6256 <unknown>
          # #5 0x560f4c704af6 <unknown>
          # #6 0x560f4c70445f <unknown>
          # #7 0x560f4c6fca73 <unknown>
          # #8 0x560f4c6d14f3 <unknown>
          # #9 0x560f4c6d2731 <unknown>
          # #10 0x560f4c8e962e <unknown>
          # #11 0x560f4c8ecac2 <unknown>
          # #12 0x560f4c8cff4e <unknown>
          # #13 0x560f4c8ed743 <unknown>
          # #14 0x560f4c8c436f <unknown>
          # #15 0x560f4c90da28 <unknown>
          # #16 0x560f4c90dba6 <unknown>
          # #17 0x560f4c927d52 <unknown>
          # #18 0x7f8e7aa94ac3 <unknown>

Finished in 4.31 seconds (files took 2.21 seconds to load)
70 examples, 1 failure

Failed examples:

rspec ./spec/system/tasks_spec.rb:12 # Tasks user toggles a task

11章本文の記述ミスについて

11章「テスト駆動開発に向けて」の「レッドからグリーンへ」における「RSpecは次に何を…」で始まる段落内で記述ミスと思しき箇所を発見したので報告します。自分の勘違いであればご容赦ください🙏

以下のcomplete?は、正しくはcompleted?ではないでしょうか?

スクリーンショット

以下はmobi版をKindle for PCで開いたスクショですが、念の為PDF版など他バージョンでも同様の記述ミスを確認しております〜

長谷川雅士さんの_Kindle_for_Mac_3_-_Everyday_Rails_-_RSpecによるRailsテスト入門

"Active Job" と思われる文言が "Action Job" になっている

PDFのP192「10. その他のテスト - メール送信をテストする」の3行目(コードブロックは除く)において、以下のように記載されています

このメソッドはAction Jobが UserMailer.welcome_email に提供してくれるメソッドです。

Action Job の部分は、正しくは Active job なのではないかと思いました。

bin/dev がすぐに終了してしまう

以下のように bin/dev がすぐに終了してしまいます。

$ bin/dev
09:18:54 web.1  | started with pid 62145
09:18:54 js.1   | started with pid 62146
09:18:54 css.1  | started with pid 62147
yarn build:css v0.15.1
yarn build v0.15.1
$ sass ./app/assets/stylesheets/application.bootstrap.scss ./app/assets/builds/application.css --no-source-map --load-path=node_modules 
$ esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds 
09:18:54 js.1   | 
09:18:54 js.1   |   app/assets/builds/application.js      366.8kb
09:18:54 js.1   |   app/assets/builds/application.js.map  619.0kb
09:18:54 js.1   | 
09:18:54 js.1   | ⚡ Done in 33ms
Done in 0.11s.
09:18:54 web.1  | => Booting Puma
09:18:54 web.1  | => Rails 7.0.1 application starting in development 
09:18:54 web.1  | => Run `bin/rails server --help` for more startup options
09:18:54 web.1  | Puma starting in single mode...
09:18:54 web.1  | * Puma version: 5.5.2 (ruby 3.1.1-p18) ("Zawgyi")
09:18:54 web.1  | *  Min threads: 5
09:18:54 web.1  | *  Max threads: 5
09:18:54 web.1  | *  Environment: development
09:18:54 web.1  | *          PID: 62145
09:18:54 web.1  | * Listening on http://127.0.0.1:3000
09:18:54 web.1  | * Listening on http://[::1]:3000
09:18:54 web.1  | Use Ctrl-C to stop
09:18:55 js.1   | exited with code 0
09:18:55 system | sending SIGTERM to all processes
09:18:55 web.1  | - Gracefully stopping, waiting for requests to finish
09:18:55 web.1  | Exiting
09:18:55 web.1  | terminated by SIGTERM
09:18:55 css.1  | terminated by SIGTERM

--watch が無視されているようだったので、適当に調べてみて -- を追加してみると動いているようなので、詳しいことはよくわかりませんが、最近の yarn では -- が必須になっているのではないでしょうか。

$ git diff Procfile.dev
diff --git a/Procfile.dev b/Procfile.dev
index 2b0b260..c5e1606 100755
--- a/Procfile.dev
+++ b/Procfile.dev
@@ -1,3 +1,3 @@
 web: bin/rails server -p 3000
-js: yarn build --watch
-css: yarn build:css --watch
+js: yarn build -- --watch
+css: yarn build:css -- --watch
$ bin/dev 
09:20:47 web.1  | started with pid 62309
09:20:47 js.1   | started with pid 62310
09:20:47 css.1  | started with pid 62311
yarn build v0.15.1
yarn build:css v0.15.1
$ esbuild app/javascript/*.* --bundle --sourcemap --outdir=app/assets/builds --watch
$ sass ./app/assets/stylesheets/application.bootstrap.scss ./app/assets/builds/application.css --no-source-map --load-path=node_modules --watch
09:20:47 js.1   | [watch] build finished, watching for changes...
09:20:47 web.1  | => Booting Puma
09:20:47 web.1  | => Rails 7.0.1 application starting in development 
09:20:47 web.1  | => Run `bin/rails server --help` for more startup options
09:20:48 web.1  | Puma starting in single mode...
09:20:48 web.1  | * Puma version: 5.5.2 (ruby 3.1.1-p18) ("Zawgyi")
09:20:48 web.1  | *  Min threads: 5
09:20:48 web.1  | *  Max threads: 5
09:20:48 web.1  | *  Environment: development
09:20:48 web.1  | *          PID: 62309
09:20:48 web.1  | * Listening on http://127.0.0.1:3000
09:20:48 web.1  | * Listening on http://[::1]:3000
09:20:48 web.1  | Use Ctrl-C to stop
09:20:48 css.1  | Sass is watching for changes. Press Ctrl-C to stop.
09:20:48 css.1  | 

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.