1

Rails 初心者として rspec に苦労しており、Active Record に渡された URL を検証する必要があります。これはおそらく私の無知によるものなので、plsは私を正しい方向に向けます. video_url は、有効な URL として検証したい文字列フィールドです。周りを見回して、rspec で完全にテストされているように見えたので、この gem を選びました。私のテストでは、彼の検証テストをモデル テストに組み込む方法がわかりませんでした。

Rails コンソールで Post オブジェクトを作成し、見つからないことがわかっている偽の URL を入力すると、エラーが発生するようにしました。興味深いことに、gem をインストールしたテストでこれを再現しようとすると、エラーが検出されないため、テストに失敗します。コンソールに表示されたときに、何らかのエラーが発生することが予想されました。私の質問は、エラーが発生しないという点で、何が間違っているのでしょうか? 何が原因であるかを三角測量しようと何度か試みましたが、gem は rspec で動作しないようですか? コンソールで動作させることができれば、rspecで動作させることができると思いましたか?

post.rb

 class Post < ActiveRecord::Base
   attr_accessible :body, :title, :image, :video_title, :video_url
   validates_presence_of :title, :body, :author
   validates :video_url, :presence => true, :if => :video_title_present?, :url => { 
        :check_path => [ 300..399, 400..499, 500..599 ], :allow_nil => true,
        :url_not_accessible_message => "must be valid.",
        :invalid_url_message => "must be valid.",
        :url_invalid_response_message => "must be valid."}

   def video_title_present?
     !self.video_title.blank?
   end
   belongs_to :author, class_name: "User"
 end

post_spec.rb

 before do
   @post = Post.new(title: "foo", body: "my body here")
 end

 describe "validates with video links" do
   it "validates with video url and video title" do
     @post.video_url = "http://heckitoqi.com"
     @post.video_title = "my title"
     @post.should have_at_least(1).error_on(:video_url)
   end
 end

コンソールでの出力:

 Failure/Error: @post.should have_at_least(1).error_on(:video_url)
 expected at least 1 error on :video_url, got 0

いくつかのエラーで、より自由度の高いエラーを試みましたが、エラーをキャッチできずに失敗しました。

以下は、Rails コンソールを使用したモデルのスモーク テストの短いバージョンです。

 u = User.first
 p = Post.new(title: "title", body: "body", video_title: "vtitle", video_url: "http://heckitoqi.com")
 p.author = u
 p.save!

 >> HTTPI GET request to heckitoqi.com (net_http)
 >> ActiveRecord::RecordInvalid: Validation failed: Video url must be valid.

コンソールで検証できる場合は、テストの実装に問題がありますよね? 私は自分が間違っていることを理解していません。ありがとう、サム

4

0 に答える 0