作为一个新的 Rails 人,我正在为 rspec 苦苦挣扎,我需要验证传递给 Active Record 的 url。这可能是由于我的无知,所以请指出我正确的方向。video_url 是一个字符串字段,我想将其验证为有效的 URL。环顾四周,我选择了这个 gem,因为它似乎在 rspec 中经过了全面测试。对于我的测试,我没有看到如何将他的验证测试合并到我的模型测试中。
在 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.
如果我可以让它在控制台中验证,那么我的测试实现有问题,对吧?我只是不明白我做错了什么。谢谢,山姆