2012-01-25 20 views
3

URLの有効なフォーマットが必要なモデルがあります。単体テスト検証のためのテストに失敗する方法URLのフォーマット

class Event < ActiveRecord::Base 

    validates_format_of :url, :with => /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix 

end 

しかしは、私は失敗したテストを書きたいのソリューションを実装する前に。これは誰かが失敗したテストを書いていく方法ですか? (高度なテスト/マッチャーフレームワークに行く前に、基本的に固執しようとしてくださいなしRSpecのかShouldaソリューション。

class EventTest < ActiveSupport::TestCase 

setup do 
# These attributes are valid 
@event_attributes = { :title => "A title", 
         :url => "http://somedomain.com/images/land.jpg",} 
end 

test "should not be valid with an INVALID URL" do 
    @event = Event.new(@event_attributes.merge(:url => "htp:/domain")) 
    assert_no_match(/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix, @event.url, "Not a valid format") 
    end 

end 

assert_no_matchが正しいアプローチです。任意の提案。

+0

私が焦点を当てているのは、rspec(より読みやすいimhoです)とrubularの組み合わせを使用してテストに合ったURLを作成するというhartlの推奨に従うということです。私はTestCaseについてはわかりませんが、あなたは正直なところにいるようですが、正規表現に対してもう少し失敗している例を試してみてください。 – prusswan

+0

さて、私はRSpecに飛び込む必要があるかもしれませんが、私はそれを突き出してMiniTestを試してみる必要があると思います。私はあなたが言及したチュートリアルをチェックアウトするのを知らない。ありがとう – alenm

+1

私は、URLを検証するために正規表現を使うべきではないと思います。 'before.validation'コールバックを' URI.parse'と一緒に使用してクリーンアップします(userinfoを削除し、スキームがない場合はスキームを追加します)。そして、検証のために 'URI.parse'を再度確認してくださいURLコンポーネントはあなたが望むものです。 –

答えて

2

ますので、それは正しいアプローチではありません「再まったくEvent検証をテストしていない代わりに、一般的なパターンは、検証エラーをトリガし、検証例外があなたのケースで、だから、提起されたことをアサートします属性を持つオブジェクトを作成することです:。。

assert_raise(ActiveRecord::RecordInvalid) do 
    @event = Event.create!(@event_attributes.merge(:url => "htp:/domain")) 
end 

Rspecは良いですから、ある時点で試してみてください。また、あなたが使った@event_attributes.mergeパターンの素晴らしいライブラリがあります:factory_girlと呼ばれています。それをチェックして、それはあなたにいくつかの問題を保存します。

+0

説明をありがとう。あなたは私にRspecへのジャンプを教えてくれた最初の人ではありません。私は船を飛ぶ前に物事を遅くしようとしていると思う。あなたの解決策は問題ありませんが、私がテストを実行すると、次のメッセージが表示されます: 'ActiveRecord :: RecordInvalid expected。しかし何も起きませんでした。 ' – alenm

+0

確かに、検証が欠落しているとエラーが出ます。コードを変更してください。今、検証を追加する時間です。 –

関連する問題