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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

1回答

6084閲覧

rspecでのsubjectの使い方について

GOROGORO

総合スコア66

RSpec

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

0クリップ

投稿2015/06/15 13:36

Rails4 Rspec3でアプリケーション開発をしています。

テストコードとして以下のように記載しています。

lang

1 # 有効な属性の場合 2 context "with valid attributes" do 3 before{ 4 #blog_imdexを生成 5 @blog_image=FactoryGirl.build(:blog_image) 6 #ファイルが登録されるディレクトリを指定 7 @dir_path = "./public/images/#{Time.now.strftime("%Y")}/#{@blog_image.blog_index_id}/" 8 #登録する画像準備 9 IMG_FILE_NAME = 'test1.jpg' 10 @img_file_path = 'file/'+IMG_FILE_NAME 11 #登録する画像準備 12 upload_file_path = @dir_path + IMG_FILE_NAME 13 #ファイル事前に削除 14 File.unlink(upload_file_path) if File.exist?(upload_file_path) 15 } 16 17##test1 18 subject { 19 post :create, 20 :blog_images => fixture_file_upload(@img_file_path, 'image/jpg') 21 } 22 23##test2 24 it { is_expected.to change(BlogImage, :count).by(1) } 25 26 it "saves the new blog_images in the database" do 27 expect{ 28 post :create, 29 :blog_images => fixture_file_upload(@img_file_path, 'image/jpg') 30 }.to change(BlogImage, :count).by(1) 31 end 32 end 33 end

test1とtest2でsubjectを使用しているだけで、内容としては同じ意味合いとして記載しているつもりです。

ですが、テストを実行するとtest1のみエラーとなります。

lang

1Failures: 2 3 1) BlogImagesController POST #create with valid attributes should change #count by 1 4 Failure/Error: it { is_expected.to change(BlogImage, :count).by(1) } 5 expected #count to have changed by 1, but was not given a block 6 # ./spec/controllers/blog_images_controller_spec.rb:33:in `block (4 levels) in <top (required)>'

subjectの使い方が誤っているからこのようになっていると思うのですが、
どのように使うのが正解なのでしょうか。

お教えいただけないでしょうか..
どうぞよろしくお願いします。

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

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

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

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

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

guest

回答1

0

原因はエラーメッセージにも書いてありますが but was not given a block です。
changeexpectblock が必要です。

test1 について

ruby

1it { is_expected.to change(BlogImage, :count).by(1) }

ruby

1it { expect(subject).to change(BlogImage, :count).by(1) }

と同じ意味になり、エラーメッセージのとおりexpectblockがないのでエラーになります

ruby

1it { expect { subject }.to change(BlogImage, :count).by(1) }

とする事で通ると思います。

test2 について

ruby

1it "saves the new blog_images in the database" do 2 expect{ 3 post :create, 4 :blog_images => fixture_file_upload(@img_file_path, 'image/jpg') 5 }.to change(BlogImage, :count).by(1) 6end

こちらは expectblock があるので、このままで通ります。

test1と同様の誤りにするのであれば

ruby

1it "saves the new blog_images in the database" do 2 expect( 3 post :create, 4 :blog_images => fixture_file_upload(@img_file_path, 'image/jpg') 5 ).to change(BlogImage, :count).by(1) 6end

という感じで、これは test1 と同様のエラーメッセージが出るはずです。

投稿2016/10/07 22:42

hana-da

総合スコア1728

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問