約束どおり、RSpecのトピックに関する一連の記事を始めています。
この記事では、Ruby on Railsでモデルのテストを作成する方法を詳細に説明します。 すでにrspec_on_railsに精通している場合は、何か問題がある場合は修正して補足してください。 私はあなたとRspecを学んでおり、どこかで間違っているかもしれないことを思い出してください。
準備する
以前の記事を読んだ後、テストプロジェクトを作成し、構成し、データベース用のダイアグラムを作成し、gem rspecをインストールしていることを前提としています。 そうでない場合は、すぐに:
[sudo] gem install rspec
rails ./test -d mysql
nano ./test/config/database.yml
rake db:作成
それでは、プロジェクトディレクトリに移動して、コマンドを実行しましょう。
./script/generate rspec
これでプロジェクトのルートにspecディレクトリができました。 モデルのテストを直接作成することができます。
./script/generate rspec_model Post
Rspecは、自動的にモデル自体、フィクスチャ、およびモデルを作成し、次の内容のテストファイルを作成します。
File.dirname(__ FILE__)+ '/../spec_helper'が必要です
ポストドを説明する
前(:各)行う
@post = Post.new
終わり
それは「有効でなければなりません」
@ post.should be_valid
終わり
終わり
簡単なテスト例
さて、あなたはすべてのテストを初めて実行しようとすることができます、やってみましょう:
熊手仕様:モデル
ああああああ、やった。 Rspecの発言:
1件の保留中の移行があります:
20090302064129 CreatePosts
「rake db:migrate」を実行してデータベースを更新し、再試行してください。
さて、私たちに求められていることをしましょうが、その前に、移行ファイルを少しこの状態に微調整しましょう。
クラスCreatePosts <ActiveRecord ::移行
def self.up
create_table:投稿する| t |
t.string:name ,: limit => 50 ,: null => false
t.text:コンテンツ
t.timestamps
終わり
終わり
def self.down
drop_table:投稿
終わり
終わり
片頭痛を実行し、テストを再度実行します。
rake db:移行
熊手仕様:モデル
そして出来上がり、私たちのテストは正常に合格しました(何か問題がある場合は、コメントを書いてください、私は助けようとします):
。
0.040821秒で終了
1つの例、0の失敗
先頭のドットはテストが成功したことを意味し、文字Fはテストが失敗したことを意味します。 ここで例を少し複雑にしましょう。 コードを少し変更します。
「名前が必要」
@ post.name = nil
@ post.should_not be_valid
@ post.errors.on(:name).should_not be_nil
終わり
実行後、次のものが得られます。
F
1)
「投稿「名前が必要です」」に失敗しました
有効だと思われますか? falseを返すには、trueになりました
./spec/models/post_spec.rb:10:
0.045391秒で終了
1つの例、1つの障害
レーキは中止されました!
OK、すべてが正しくなるまで、モデルに検証を追加する必要があります。
validates_presence_of:名前
validates_length_of:name ,: within => 3..50
私たちは再び運転します、今はすべてがOKです。 テストは成功しました。
フィクスチャを使用する
ファイルを編集してみましょう〜/ spec / fixtures / post.yml:
一つ:
id:1
名前:「これは一番最初の投稿です」
内容:「tru la la、tra la la」
2:
id:2
名前:「これは2番目の投稿です」
内容:「tran tan tan、tra ta ta」
次に、テストを次の形式に変更します。
File.dirname(__ FILE__)+ '/../spec_helper'が必要です
ポストドを説明する
備品:投稿
前(:各)行う
@post = Post.new
終わり
「名前が必要」
@ post.name = nil
@ post.should_not be_valid
@ post.errors.on(:name).should_not be_nil
終わり
「投稿をクリア」する
投稿(:1).destroy
lambda {posts(:one).reload} .should raise_error(ActiveRecord :: RecordNotFound)
終わり
終わり
したがって、すべてのフィクスチャ(フィクスチャ:投稿)をロードし、それらを直接操作して、posts.ymlで指定された文字(ポスト(:1))で呼び出します。
今日はこれですべてです。これで、モデルのテストを書き始めるのに十分なはずです。
次の記事では、コントローラーとビューのテストを作成することを検討します。