2017-09-20 11 views
0

私は非常に新しい、古い制限を上書きしますが、私は持っている私の問題は、次のとおりです。はなぜ検証し、レール内

とき、私だけのタイプ、次のコード:

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 

はなぜこれが起こっているのでしょうか?

EDIT

これは私のテストのコードです:

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 
+4

2 'validates'ための句を「各**、」ありません「**のいずれか**。」テスト自体を示してください。 – mudasobwa

+0

新しい制限__do not__古い警告を無効にする/キャンセルするため、エラーが発生します。 –

答えて

1

あなたはどちらdomainIPそれらのいずれもありませんどちらか1を検証します。

有効な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 
+0

ありがとうございました!出来た! – olegario

1

あなたのテスト方法と間違っている検証に関する仮定としてあるべきだと思います。 .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 
+0

またRubyが[URIモジュール](https://docs.ruby-lang.org/en/2.1.0/URI.html)を持っているときに、そのようなモデルを最初に作成する理由は本当にわかりません。この非常に目的のために。 – max

関連する問題