2012-02-02 7 views
1

あなたが彼らの存在をテストしている属性のリストを持って、あなたは以下の持っている場合:RSpecのテスト:それは{respond_to必要があります()}

before do 
    @attr = Employee.new(name: "One", 
         email: "[email protected]") 
end 

subject { @attr } 

it { should respond_to(:name) } 
it { should respond_to(:email) } 

it { should be_valid } 

ことができます逆のため、その後の試験、すなわち、もしこれらの属性は、使用して空白です:

it { should_not respond_to(:reverse, :blank) } 
it { should_not be_valid } 

私は上記を試してみましたが、私もthis discussionを読んだ後、すべてがうまく問題を理解していません。

同じ初期設定を使用して存在をテストし、空白の属性を調べてテストする方法を知っている人はいますか?ユーザーオブジェクトの

+0

正確にここでテストしようとしていますか?何かがメソッドに応答するかどうかをテストし、そのメソッドの戻り値が空白であるかどうかをテストすることは、ばらばらの概念です。 –

答えて

21

私はあなたがrespond_toがあなたのテストで何を誤解したと思う:あなたは存在の検証を持っていた場合、これらのテストは良いでしょう。あなたはあなたが@attr.respond_to(:name)戻っtrueが、方法が存在することを意味することを主張している

it { should respond_to(:name) } 

を行うと、それは値を返しますないことを。 nameメソッドを呼び出した結果は、非偽、非空の値を返すことを確認します

its(:name){ should be_present } 

:あなたは返される値があることをテストする場合は、あなたのような何かを行うことができます。あなたはそのテストに

its(:name){ should_not be_present } 

を逆にする場合次に、あなたはname方法が空白戻っていると主張しています。異なる状態のオブジェクトをテストしているので、2番目のテストの別のセットアップを作成する必要があります。

+0

ありがとう@エミリー...私は確かにrespond_toの間違った理解を持っていた。私はあなたの指導の充実を得るために、より多くの読書と実験をする必要があります。妥当性:プレゼンスは値があるかどうかという点でバーを満たしていますか? – thomasvermaak

+1

Rspecの素晴らしい点は、自分でその種のものをテストすることがいかに簡単かということです。 Rspecで 'be_present'を呼び出すと、モデル上で' present? 'が呼び出されます。 respond_to?と同じです。これらのメソッドをIRBで簡単にテストできます。しかし、 'present 'は、' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' 'を返します。 – Emily

0

あなたの個々のテストは、よりこのようにする必要があります:あなたは、クラスをテストしている場合

it "should have an email attribute" do 
    @attr.should respond_to(:email) } 
end 

しかし、私はあなたのテストのために、この線に沿ってより多くの何かを提案することがあります

before (:each) do 
    @attr = {name: "One", email: "[email protected]"} 
end 

次に、あなたの最初のテストは作成がそうのような働きを保証:

it "should create a new instance given valid attributes" do 
    Employee.create!(@attr) 
end 

you'vたら、テストを逆転し、属性が空白であれば、それは有効ではないことを指定についてのご質問に答えるために

describe "Attributes and method tests" do 
    before (:each) do 
    @employee = Employee.create(@attr) 
    end 

    it "should have a name attribute" do 
    @employee.should respond_to(:name) 
    end 

    it "should have an email attribute" do 
    @employee.should respond_to(:email) } 
    end 

    # etc... (to test other attributes or methods) 
end 

:eはそれはあなたが働いて、あなたの他のテストを続行し、従業員が自動的にそのように作成されますすることができ設立しました私はこのようなものを試してみるだろう。

it "should not be valid with a blank email" do 
    Employee.new(@attr.merge(:email => '').should_not be_valid 
end 

it "should not be valid with a blank name" do 
    Employee.new(@attr.merge(:name => '').should_not be_valid 
end 
+0

これは主観的であり、質問に全く答えません。 –

+0

申し訳ありませんが、私はあなたの質問を最初に誤解しました。テストを書くための適切なフォーマットを理解するのが難しいと言っていたと思っていました。私は私の答えを更新しました。 – Batkins

+0

さて、それは*私の*質問ではありませんが、あなたが持っていた元のものを残しても、まだ主観的な綿毛、IMOを誤解しているだけです。 –

関連する問題