Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 单元测试如何通过URL格式验证的测试_Ruby On Rails_Ruby_Validation_Unit Testing - Fatal编程技术网

Ruby on rails 单元测试如何通过URL格式验证的测试

Ruby on rails 单元测试如何通过URL格式验证的测试,ruby-on-rails,ruby,validation,unit-testing,Ruby On Rails,Ruby,Validation,Unit Testing,我有一个模型需要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 class事件“http://somedomain.com/images/land.jpg",} 结束 测试“不应与无效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
class事件
但在实施解决方案之前,我想编写一个失败的测试。有人会这样写一个失败的测试吗?(请不要使用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
classeventtest“一个标题”,
:url=>“http://somedomain.com/images/land.jpg",}
结束
测试“不应与无效URL一起有效”do
@event=event.new(@event\u attributes.merge(:url=>“htp:/domain”))
断言不匹配(/^(http | https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})(\/.*$/ix,@event.url,“格式无效”)
结束
结束

assert\u no\u match
是正确的方法吗?有什么建议吗?

这不是正确的方法,因为您根本没有测试
事件
验证。相反,一个常见的模式是创建一个具有属性的对象,该属性将触发验证错误并断言已引发验证异常。因此,在你的情况:

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

Rspec很好,所以你应该在某个时候尝试它,我认为这比以后更好。还有一个很好的
@event\u属性库。合并你使用过的模式:它被调用。检查一下,它会帮你省去一些麻烦。

如果重点放在rails上,我会按照hartl的建议使用Rspec的组合(在imho中,哪个更容易阅读)我不知道TestCase,但你似乎走对了方向,尽管你可能想尝试一些针对正则表达式的失败例子。好吧,也许我需要跳转到RSpec,我觉得我需要坚持下去,也许可以尝试MiniTest。我不知道我会签出你提到的教程。谢谢顺便说一句,我认为你根本不应该使用正则表达式来验证URL。在验证之前使用
回调以及
URI。解析
来清理它(去掉userinfo,如果没有方案,则添加方案,…)然后再次进行
URI.parse
验证,以确保URL组件是您想要的组件。感谢您的澄清。您不是第一个告诉我跳转到Rspec的人。我想我在跳转之前会尝试做得很慢。您的解决方案很好,但当我运行测试时,我得到以下消息
ActiveRecord::RecordInvalid是预期的,但未引发任何问题。
是的,准确地说,如果缺少验证,则会出现错误-测试失败表示您应该更改代码。现在是添加验证的时候了。