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

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

新規登録して質問してみよう
ただいま回答率
85.49%
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回答

6788閲覧

rspecの実行エラーについて(railsのmodelスペック)

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クリップ

投稿2016/01/26 14:48

編集2016/01/29 13:34

こんにちは。
rspec 3.3.2
rails 4.1.4
ruby 2.1.1

でmodelのスペックファイルを作成しています。
作成したスペックを実行したところ、うまくスペックが通らず、何が原因なのかわからないです。
以下に実行結果およびテーブル定義、コードを記載します。
原因がお分かりになる方、なぜスペックが通らないのかお教えいただけないでしょうか?
以下実行結果の、
1)はstockCodeを空のexampleにしているつもりなのですが、なぜstockCodeが1128となるのか?(この1128はどこから来た?)がわからないです。
2)はスペックをraise_errorでエラーが出て合格と書いているつもりなのに、なぜスペックが通らないのかがわからないです。

よろしくお願いします。

実行結果

Failures: 1) Company passed valid param without stockCode should be falsey Failure/Error: it {is_expected.to be_falsey} expected: falsey value got: #<Company stockCode: 1128, companyName: "テスト株式会社"> # ./spec/models/company_spec.rb:17:in `block (4 levels) in <top (required)>' 2) Company passed valid param without companyName Failure/Error: let(:company){ Company.create(params)} ActiveRecord::StatementInvalid: Mysql2::Error: Field 'companyName' doesn't have a default value: INSERT INTO `companies` (`stockCode`) VALUES (1111) # ./spec/models/company_spec.rb:4:in `block (2 levels) in <top (required)>' # ./spec/models/company_spec.rb:6:in `block (2 levels) in <top (required)>' # ./spec/models/company_spec.rb:22:in `block (4 levels) in <top (required)>'

スペックファイル

require 'rails_helper' RSpec.describe Company, type: :model do let(:company){ Company.create(params)} let(:params){ {stockCode: stockCode , companyName: companyName}} subject {company} context 'passed invalid param'do context 'without stockCode' do let(:stockCode){} let(:companyName){'テスト株式会社'} it {is_expected.to be_falsey} end context 'without companyName' do let(:stockCode){1111} let(:companyName){} it {is_expected.to raise_error} end end end

テーブル定義

mysql> desc companies; +-------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +-------------+--------------+------+-----+---------+-------+ | stockCode | int(11) | NO | PRI | NULL | | | companyName | varchar(255) | NO | | NULL | | +-------------+--------------+------+-----+---------+-------+ 2 rows in set (0.00 sec) mysql>

モデル

class Company < ActiveRecord::Base has_many :daily_stock_infos , foreign_key: :stockCode ,primary_key: :stockCode has_many :check_stock , foreign_key: :stockCode ,primary_key: :stockCode end

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

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

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

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

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

guest

回答1

0

ベストアンサー

こちらで試してみました。

1については、なぜ1128が入っているのかわかりません。
mysqlでデータが残っていないか確認してみてください。
こちらでは、nilのままとなっています。

Ruby

1it "is nil" do 2 expect(stockCode).to be_nil 3end

2に関しては、試したのはRspec3.2.3で違うのですが、is_expectedでは、例外を拾えないのかと思います。
かっこで囲ってやるとパスしました。

Ruby

1 #it {is_expected.to raise_error} 2 it "does raise an exception" do 3 expect{ subject }.to raise_error 4 end

投稿2016/01/29 15:49

miyamiya

総合スコア691

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

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

GOROGORO

2016/02/02 14:36

ありがとうございます。いただいた方法で例外を拾うことができました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問