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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

1101閲覧

Rails チュートリアル 13章 RSpecでのPost数増減のテストでDeleteが機能しない

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

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

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2020/09/26 15:34

Rails チュートリアルの13章 リスト13-55においてUIに対する統合テストを初心者なりにRSpecで書いていたのですが、#destroyの部分でエラーが発生してしまいます。13章の最初からコードを見直したり、数時間調べていましたがどうにも解決しません。どうかご教示お願いします。

エラーメッセージ

Failures: 1) microposts interface #destroy post delete post Failure/Error: expect do delete micropost_path(micropost) end.to change(Micropost, :count).by(-1) expected `Micropost.count` to have changed by -1, but was changed by 0 # ./spec/requests/microposts_interface_spec.rb:30:in `block (3 levels) in <top (required)>' Finished in 3.79 seconds (files took 19.72 seconds to load) 3 examples, 1 failure Failed examples: rspec ./spec/requests/microposts_interface_spec.rb:27 # microposts interface #destroy post delete post

test.log

[1m (0.1ms) SELECT COUNT(*) FROM "microposts"  (0.1ms) SAVEPOINT active_record_1 Micropost Create (0.2ms) INSERT INTO "microposts" ("content", "user_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["content", "This is test post"], ["user_id", 1046959424], ["created_at", "2020-09-26 15:20:13.351638"], ["updated_at", "2020-09-26 15:20:13.351638"]]  (5.5ms) RELEASE SAVEPOINT active_record_1 Started DELETE "/microposts/1033843181" for 127.0.0.1 at 2020-09-27 00:20:13 +0900 Processing by MicropostsController#destroy as HTML Parameters: {"id"=>"1033843181"} User Load (0.1ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1046959424], ["LIMIT", 1]] Micropost Load (0.2ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = ? AND "microposts"."id" = ? ORDER BY "microposts"."created_at" DESC LIMIT ? [["user_id", 1046959424], ["id", 1033843181], ["LIMIT", 1]]  (0.1ms) SAVEPOINT active_record_1 Micropost Destroy (0.1ms) DELETE FROM "microposts" WHERE "microposts"."id" = ? [["id", 1033843181]]  (0.1ms) RELEASE SAVEPOINT active_record_1 Redirected to http://www.example.com/home Completed 302 Found in 4ms (ActiveRecord: 0.5ms)  (0.1ms) SELECT COUNT(*) FROM "microposts"  (0.4ms) rollback transaction

/spec/requests/microposts_interface_spec.rb

require "rails_helper" RSpec.describe "microposts interface" do let(:user) { create(:user) } let(:micropost) { user.microposts.create(content: "This is test post") } describe "#create post" do it "submit invalid post" do sign_in_as(user) visit home_path expect do post microposts_path, params: { micropost: { content: "" } } end.to change(Micropost, :count).by(0) expect(response).to render_template "static_pages/home" end it "submit valid post" do sign_in_as(user) visit home_path expect do post microposts_path, params: { micropost: { content: "This is second post" } } end.to change(Micropost, :count).by(1) expect(response).to redirect_to home_path end end describe "#destroy post" do it "delete post" do sign_in_as(user) visit home_path expect do delete micropost_path(micropost) end.to change(Micropost, :count).by(-1) expect(response).to redirect_to home_path end end end

###microposts.controller.rb

class MicropostsController < ApplicationController before_action :logged_in_user, only: [:create, :destroy] before_action :correct_user, only: :destroy def create @micropost = current_user.microposts.build(micropost_params) if @micropost.save flash[:success] = "Post has created" redirect_to home_path else @feed_items = current_user.feed.paginate(page: params[:page]) render "static_pages/home" end end def destroy @micropost.destroy flash[:success] = "Your post has deleted" redirect_to request.referrer || home_path end private def micropost_params params.require(:micropost).permit(:content, :picture) end def correct_user @micropost = current_user.microposts.find_by(id: params[:id]) if @micropost.nil? redirect_to home_path end end end

###/spec/factories/users.rb

RSpec.configure do |config| config.include FactoryBot::Syntax::Methods end FactoryBot.define do factory :user do name { "Example User" } sequence(:email) { |n| "user_#{n}@example.com" } password { "password" } password_confirmation { "password" } activated {true} activated_at {Time.zone.now} end end

補足情報(FW/ツールのバージョンなど)

source 'https://rubygems.org' gem 'rails', '5.2.4' gem 'bootstrap-sass', '3.4.1' gem 'sass-rails', '>= 3.2' gem 'puma', '3.9.1' gem 'uglifier', '3.2.0' gem 'coffee-rails', '4.2.2' gem 'jquery-rails', '4.3.1' gem 'turbolinks', '5.0.1' gem 'jbuilder', '2.7.0' gem "haml-rails", "~> 2.0" gem 'bootsnap', require: false gem 'bcrypt', '3.1.12' gem 'faker', '1.7.3' gem 'will_paginate', '3.1.7' gem 'bootstrap-will_paginate', '1.0.0' gem 'carrierwave', '1.2.2' gem 'mini_magick', '4.7.0' group :development, :test do gem 'sqlite3', '1.3.13' gem 'byebug', '9.0.6', platform: :mri gem 'rspec-rails', '~> 3.8' gem 'spring-commands-rspec' gem 'capybara' gem 'webdrivers' gem 'factory_bot_rails' gem 'shoulda-matchers' gem 'rails-controller-testing' end group :development do gem 'web-console', '3.5.1' gem 'listen', '3.1.5' gem 'spring', '2.0.2' gem 'spring-watcher-listen', '2.0.1' end group :test do gem 'minitest', '5.14.2' gem 'minitest-reporters', '1.1.14' gem 'guard', '2.16.2' gem 'guard-minitest', '2.4.4' end group :production do gem 'pg', '0.20.0' gem 'fog', '1.42' end

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

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

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

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

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

hatsu

2020/09/26 16:14

削除する前にmicropostが作られていないために0のまま7日と思いました。 let(:micropost) から let!(:micropost) のように変えてmicropostを作っておくといかがでしょうか。
退会済みユーザー

退会済みユーザー

2020/09/27 09:15

確かにlet!にしたところ、うまくdeleteが機能してくれました。ありがとうございます。回答の方にも書いていただくことは可能でしょうか?
guest

回答1

0

ベストアンサー

削除する前にmicropostが作られていないために0のままのようです。

let(:micropost) から let!(:micropost) に変えて事前にmicropostを作成すると期待通り動きそうです。

投稿2020/09/27 09:17

hatsu

総合スコア1809

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問