Ruby on rails 验证覆盖旧限制的原因

Ruby on rails 验证覆盖旧限制的原因,ruby-on-rails,ruby,regex,testing,Ruby On Rails,Ruby,Regex,Testing,我对Rails非常陌生,但我的问题是: 当我仅键入以下代码时: validates :ipaddress, :format => { :with => Resolv::IPv4::Regex, :message => 'Deve ser um endereco IP valido' } 我所有的测试都没有问题。但当我补充说: validates :ipaddress, :format => { :with => Resolv::

我对Rails非常陌生,但我的问题是:

当我仅键入以下代码时:

  validates :ipaddress, :format => {
    :with => Resolv::IPv4::Regex,
    :message => 'Deve ser um endereco IP valido'
  }
我所有的测试都没有问题。但当我补充说:

  validates :ipaddress, :format => {
    :with => Resolv::IPv4::Regex,
    :message => 'Deve ser um endereco IP valido'
  }

  validates :domain, :format => {
    :with => URI.regexp,
    :message => 'Deve ser um dominio valido'
  }
测试开始失败,并显示:

F

Failure:
UrlTest#test_test_url_with_valid_IP_address 
[/home/olegario/infracrawler/test/models/url_test.rb:7]:
Test a valid IP address.
Expected: true
Actual: false


bin/rails test test/models/url_test.rb:4

..F

Failure:
UrlTest#test_test_url_using_a_valid_domain [/home/olegario/infra-
crawler/test/models/url_test.rb:19]:
Test a valid domain.
Expected: true
Actual: false
为什么会这样

编辑

这是我的测试代码:

test 'test an url with a IP address containing characters' do
  url = Url.new()
  url.ipaddress = '192.168.2.AAA'
  assert_equal(false, url.valid?, 'Test a invalid IP address')
end

test 'test url using a valid domain' do
  url = Url.new()
  url.domain = 'http://google.com'
  assert_equal(true, url.valid?, 'Test a valid domain')
end 

您正在验证
IP
两者,而不是其中任何一个。

即使您提供了有效的ip地址,ip地址的第一次测试也将失败并返回false

我认为正确的测试应该如下

test 'test an url with a IP address containing characters' do
  url = Url.new()
  url.ipaddress = '192.168.2.AAA'
  url.domain = 'http://google.com'
  assert_equal(false, url.valid?, 'Test a invalid IP address')
end

test 'test url using a valid domain' do
  url = Url.new()
  url.ipaddress = '192.168.2.1'
  url.domain = 'http://google.com'
  assert_equal(true, url.valid?, 'Test a valid domain')
end 

您正在验证
IP
两者,而不是其中任何一个。

即使您提供了有效的ip地址,ip地址的第一次测试也将失败并返回false

我认为正确的测试应该如下

test 'test an url with a IP address containing characters' do
  url = Url.new()
  url.ipaddress = '192.168.2.AAA'
  url.domain = 'http://google.com'
  assert_equal(false, url.valid?, 'Test a invalid IP address')
end

test 'test url using a valid domain' do
  url = Url.new()
  url.ipaddress = '192.168.2.1'
  url.domain = 'http://google.com'
  assert_equal(true, url.valid?, 'Test a valid domain')
end 

您的测试方法和关于验证的假设是错误的。
.valid?
方法运行模型中的所有验证。生成的错误将添加到模型实例中的错误哈希中。如果错误哈希为空,则返回true(有效),否则返回false

因此,通过断言
.valid?
为真/假来测试验证容易出错,因为每个测试都必须考虑其他验证

要单独测试单个验证,应编写有关错误哈希的断言:

test 'test an url with a IP address containing characters' do
  url = Url.new(ipaddress: '192.168.2.AAA')
  url.valid? # runs the validations
  assert_true(url.errors.has_key?(:ipaddress))
  assert_contains(url.errors][:ipaddress], 'Deve ser um endereco IP valido')
end

test 'test an url with a valid ip' do
  url = Url.new(ipaddress: '192.168.2.1')
  url.valid? # runs the validations
  assert_false(url.errors.has_key?(:ipaddress))
end

您的测试方法和关于验证的假设是错误的。
.valid?
方法运行模型中的所有验证。生成的错误将添加到模型实例中的错误哈希中。如果错误哈希为空,则返回true(有效),否则返回false

因此,通过断言
.valid?
为真/假来测试验证容易出错,因为每个测试都必须考虑其他验证

要单独测试单个验证,应编写有关错误哈希的断言:

test 'test an url with a IP address containing characters' do
  url = Url.new(ipaddress: '192.168.2.AAA')
  url.valid? # runs the validations
  assert_true(url.errors.has_key?(:ipaddress))
  assert_contains(url.errors][:ipaddress], 'Deve ser um endereco IP valido')
end

test 'test an url with a valid ip' do
  url = Url.new(ipaddress: '192.168.2.1')
  url.valid? # runs the validations
  assert_false(url.errors.has_key?(:ipaddress))
end

因为两个
validates
子句是“每个”,而不是“任何一个”。请显示测试本身。出现错误的原因正是因为新的限制没有覆盖/取消旧的限制。因为两个
validates
子句是“每个”,而不是“任何一个”请显示测试本身。你会出现错误,正是因为新的限制不会覆盖/取消旧的限制。而且我真的不明白为什么你会在Ruby有一个用于此目的的模型时首先创建这样一个模型。我真的不明白为什么你会在Ruby有一个用于此目的的模型时首先创建这样一个模型。