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