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

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

ただいまの
回答率

87.48%

Failure/Error: expect(page).to have_no_content("#{drink.name}") expected not to find text

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 441

score 13

前提・実現したいこと

投稿した、投稿の削除の結合テストを書いてるのですが、パスできません
このアプリのgithub

docker上で開発していて、クロムをインストールしました

発生している問題・エラーメッセージ

soichirohara@SoichironoMacBook-Pro coffee_passport % docker-compose exec web rspec  spec/system/drinks_spec.rb


Drinks
  投稿ができる時
    ログインしたユーザーは新規投稿できる
  投稿ができない時
    ログインしてないユーザーは新規投稿できない
  削除できるとき
    投稿した本人ならその投稿を削除できる (FAILED - 1)
  削除できない時
    投稿した本人ではないので、その投稿が削除できない

Failures:

  1) Drinks 削除できるとき 投稿した本人ならその投稿を削除できる
     Failure/Error: expect(page).to have_no_content("#{drink.name}")
       expected not to find text "TOKYOロースト" in "はらそう\n投稿する\n商品を購入\n検索\nTimeline\nSelected\nはらそう\nTOKYOロースト\n350円(税込み)\nこれはコーヒーの説明です\n0\nはらそう\nTOKYOロースト\n350円(税込み)\nこれはコーヒーの説明です\n0"
     # ./spec/system/drinks_spec.rb:79:in `block (3 levels) in <top (required)>'

Finished in 4.73 seconds (files took 3.89 seconds to load)
4 examples, 1 failure

Failed examples:

rspec ./spec/system/drinks_spec.rb:59 # Drinks 削除できるとき 投稿した本人ならその投稿を削除できる

ERROR: 1
soichirohara@SoichironoMacBook-Pro coffee_passport % docker-compose exec web rspec  spec/system/drinks_spec.rb


Drinks
  投稿ができる時
    ログインしたユーザーは新規投稿できる
  投稿ができない時
    ログインしてないユーザーは新規投稿できない
  削除できるとき
    投稿した本人ならその投稿を削除できる (FAILED - 1)
  削除できない時
    投稿した本人ではないので、その投稿が削除できない

Failures:

  1) Drinks 削除できるとき 投稿した本人ならその投稿を削除できる
     Failure/Error: expect(page).to have_no_content("TOKYOロースト")
       expected not to find text "TOKYOロースト" in "はらそう\n投稿する\n商品を購入\n検索\nTimeline\nSelected\nはらそう\nTOKYOロースト\n350円(税込み)\nこれはコーヒーの説明です\n0\nはらそう\nTOKYOロースト\n350円(税込み)\nこれはコーヒーの説明です\n0"
     # ./spec/system/drinks_spec.rb:79:in `block (3 levels) in <top (required)>'

Finished in 4.62 seconds (files took 3.99 seconds to load)
4 examples, 1 failure

Failed examples:

rspec ./spec/system/drinks_spec.rb:59 # Drinks 削除できるとき 投稿した本人ならその投稿を削除できる

ERROR: 1

該当のソースコード

spec/system/drinks_spec.rb

    let!(:user) { FactoryBot.create(:user) }
    let(:drink) { FactoryBot.create(:drink) }
    let!(:other_user) { FactoryBot.create(:user) }
    let(:other_drink) { FactoryBot.create(:drink) }

  context '削除できるとき' do 
    it "投稿した本人ならその投稿を削除できる" do

    visit login_path
    fill_in 'email', with: drink.user.email
    fill_in 'password', with: drink.user.password
    find('input[name="commit"]').click
    expect(current_path).to eq(user_path(drink.user))

      # 投稿詳細ページに移動
      visit drink_path(drink)
      # 削除のリンクがある
      expect(page).to have_link '削除する', href: drink_path(drink)
      # 削除したら、Drinkモデルのカウントが1減る
      expect{
        find_link('削除する', href: drink_path(drink)).click
      }.to change { Drink.count }.by(-1)
      # トップページに遷移される
      visit root_path
      # 削除した投稿はない
      expect(page).to have_no_content(drink.image)
      expect(page).to have_no_content("TOKYOロースト")
      expect(page).to have_no_content("#{drink.price}")
      expect(page).to have_no_content("#{drink.explain}")
    end
  end

factories/drinks.rb

FactoryBot.define do
  factory :drink do
    name                {"TOKYOロースト"}
    price               {350}
    explain             {"これはコーヒーの説明です"}
    region_id           {2}
    body_id             {Body.all.sample}
    acidity_id          {Acidity.all.sample}
    processing_id       {Processing.all.sample}
    likes_count         {2}
    association :user 
    association :region
    association :body
    association :acidity
    association :processing

    after(:build) do |drink|
      drink.image.attach(io: File.open('app/assets/images/ethiopia.jpg'), filename: 'ethiopia.jpg')
    end
  end
end

docker-compose.yml

  web:
    enviroment:
      SELENIUM_DRIVER_URL: http://selenium_chrome:4444/wd/hub"
  selenium_chrome:
    image: selenium/standalone-chrome-debug
    logging:
      driver: none

Dockerfile

# chromeの追加
RUN apt-get update && apt-get install -y unzip && \
    CHROME_DRIVER_VERSION=`curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE` && \
    wget -N http://chromedriver.storage.googleapis.com/$CHROME_DRIVER_VERSION/chromedriver_linux64.zip -P ~/ && \
    unzip ~/chromedriver_linux64.zip -d ~/ && \
    rm ~/chromedriver_linux64.zip && \
    chown root:root ~/chromedriver && \
    chmod 755 ~/chromedriver && \
    mv ~/chromedriver /usr/bin/chromedriver && \
    sh -c 'wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add -' && \
    sh -c 'echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" >> /etc/apt/sources.list.d/google-chrome.list' && \
    apt-get update && apt-get install -y google-chrome-stable

spec/support/selenium_chrome.rb

require 'capybara/rspec'
require 'selenium-webdriver'

Capybara.register_driver :selenium_chrome_headless do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new


  options.add_argument('--headless')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1400,1400')


  driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.javascript_driver = :selenium_chrome_headless

spec/support/capybara.rb

Capybara.register_driver :chrome_headless do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new

  options.add_argument('--headless')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  options.add_argument('--window-size=1400,1400')

  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.javascript_driver = :chrome_headless

RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by :rack_test
  end

  config.before(:each, type: :system, js: true) do
    if ENV["SELENIUM_DRIVER_URL"].present?
      driven_by :selenium, using: :chrome, options: {
        browser: :remote,
        url: ENV.fetch("SELENIUM_DRIVER_URL"),
        desired_capabilities: :chrome
      }
    else
      driven_by :selenium_chrome_headless
    end
  end
end

試したこと

expect(page).to have_no_content("#{drink.name}")

と記載していたところ

expect(page).to have_no_content("TOKYOロースト")

と記載しました。
が、エラー内容は一緒でした。

  context '削除できるとき' do 
    it "投稿した本人ならその投稿を削除できる" do

    visit login_path
    fill_in 'email', with: drink.user.email
    fill_in 'password', with: drink.user.password
    find('input[name="commit"]').click
    expect(current_path).to eq(user_path(drink.user))

      # 投稿詳細ページに移動
      visit drink_path(drink)
      # 削除のリンクがある
      expect(page).to have_link '削除する', href: drink_path(drink)
      # 削除したら、Drinkモデルのカウントが1減る
      expect{
        find_link('削除する', href: drink_path(drink)).click
      }.to change { Drink.count }.by(-1)
      # トップページに遷移される
      visit root_path
      # 削除した投稿はない
      expect(page).to have_no_content(drink.image)
      expect(page).to have_content("TOKYOロースト")
      expect(page).to have_content("#{drink.price}")
      expect(page).to have_content("#{drink.explain}")
    end
  end

このようなテストだと通りました。
画像は削除された?のですが、      expect(page).to have_link '削除する', href: drink_path(drink)
が機能してない?

でも      expect{
find_link('削除する', href: drink_path(drink)).click
}.to change { Drink.count }.by(-1)

がパスできてる?

binding.pryを用いて色々やったのですが、なんか効果的なデバッグ方法があればご教授いただけると幸いです。

spec/system/drinks_spec.rb

    let!(:user) { FactoryBot.create(:user) }
    let(:drink) { FactoryBot.create(:drink) }
    let!(:other_user) { FactoryBot.create(:user) }
    let(:other_drink) { FactoryBot.create(:drink) }

で、

 let(:other_drink) { FactoryBot.create(:drink) }

があることで、テストがパスできないと思いコメントアウトしても、同じエラーが起こってしまいます。
削除する。のリンクをクリックするテストはパスできてるはずなので、なぜこのようなエラーが起こってしまうのか分かりません。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

投稿を削除した後に、テストの記述では
visit root_pathになってたが、アプリの仕様では、自分の詳細ページにリダイレクトされるような仕様だった。
自分のアプリの仕様の把握不足でした。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る