2011-09-13 13 views
2

私はrailstutorial.orgでチュートリアルを行ってきましたが、私は著者のコードのセクション6.2.1の存在を検証するのに少し不足していました。Railstutorial.org存在テストの検証

ユーザモデルでは、このチュートリアルではvalidates :name, :presence => trueが追加されています。十分に簡単です。

著者がrspecテストを書くことを選択すると、彼は私が少し奇妙だと思ったことをします。

describe User do 

before(:each) do 
    @attr = { :name => "Example User", :email => "[email protected]" } 
end 
. 
. 
. 
it "should require a name" do 
    no_name_user = User.new(@attr.merge(:name => "")) 
    no_name_user.should_not be_valid 
end 

end 

なぜ1を取り除くことができるとき@attrに空白文字列をマージする手間を経る:各ブロック文を単に書く:

it "should require a name" do 
    no_name_user = User.new(:name => "", :email => "[email protected]") 
    no_name_user.should_not be_valid 
end 

私は著者が@attr変数を使用していることを知っています電子メールアドレスの存在を検証することもできます。これは、なぜブロックステートメントを使用したかの指標の1つです。第2ブロック引用の構造に従う方が理にかなっています。それでも、私はここに欠けているものがあるという気持ちがあります。

私は、名前と電子メールだけの単純な場合とは対照的に、多くのキーが入力されている場合に@attr構造を使用することをお勧めします。

誰でも入力がありますか?

答えて

1

すべてのテストで使用できる標準属性マップが1つあります。テストで値でないことが必要な場合は削除されます。

私は個人的には、あなたが発見したようなものを難読化するほど価値があるとは確信していませんでしたが、そこにはあります。

1

ポイントは、テストのテストケースに関連するコードのみを持つことです。ユーザーが名前なしで有効でないことをテストするときに唯一関連する属性は、name属性です。このテストでは、電子メール属性について何も知る必要はありません。

新しいフィールドが存在するかどうかの検証を追加するとします。そのフィールドがないユーザーを作成するすべてのテストを更新する必要があります。 attrハッシュを先頭に置くと、そこに新しいフィールドが追加され、すべてのテストは正常です。

テスト用のオブジェクトを作成することは、多くの解決方法があり、どの方法が最善であるかについての議論が十分にあるという共通の問題です。私は工場を調べることをお勧めします。 MachinistとFactoryGirlは、Railsでうまくいく2つの選択肢です。

関連する問題