2015-11-26 73 views
0

我正在尝试一个挑战,我需要做一些验证。我应该通过以下测试:我的验证有什么问题?

it 'should not allow political words' do 
    body = "Petralha Tucanos Dilma" 
    opinion = Opinion.new(body: body) 
    expect(opinion).to_not be_valid 
    expect(opinion.errors[:body]).to include "Contains political words" 
end 

it 'is invalid when has no body' do 
    body = '' 
    opinion = Opinion.new(body: body) 
    expect(opinion).to_not be_valid 
    expect(opinion.errors[:body]).to include 'can\'t be blank' 
end 

it 'is invalid when has more than 150 caracters' do 
    body = 'a' * 151 
    opinion = Opinion.new(body: body) 
    expect(opinion).to_not be_valid 
    expect(opinion.errors[:body]).to include 'is too long' 
end 

要做到这一点我想在我的模型如下:

class Opinion < ActiveRecord::Base 
    validates :body, presence: true, length: { maximum: 150 }, exclusion: { in: %w(Petralha Tucanos Dilma) } 
end 

我还在一个on Rails的小白,所以任何有线索? 这些都是错误的,我得到:

1)意见不应该让政治话语 故障/错误:期待(意见).to_not be_valid 预期#为无效 #./spec/models/opinion_spec.rb :16:in'block(2 levels)in'

2)当超过150个字符时,意见无效 失败/错误:期望(opinion.errors [:body])包含'太长' 预计[“太长(最多150个字符)”]包含“太长” #./spec/models/opinion_spec.rb:33:in'block(2 levels)in'

在0.12861秒成品(文件了0.64205秒加载) 11例,2次失败

失败的例子:

rspec的./spec/models/opinion_spec.rb:12#舆论不应该让政治words rspec ./spec/models/opinion_spec.rb:28#当超过150个字符时,意见无效

+2

我编辑了您的问题以格式化代码,以便它能够正确显示并使用语法高亮显示。将来使用代码按钮“{}”或在每行新代码的开头添加4个空格(超出任何缩进范围)。 – Beartech

回答

0

您的验证不起作用,因为排除与整个字符串的值匹配:

class Opinion < ActiveRecord::Base 
    validates :a_single_word, exclusion: { in: %w(foo bar baz) } 
end 

@opinion.a_single_word = "tuna" 
@opinion.valid? == true 

@opinion.a_single_word = "I'm saying foo and bar and baz" 
@opinion.valid? == true 

@opinion.a_single_word = "foo" 
@opinion.valid? == false 

解决此问题的一个基本方法是使用正则表达式来检查整个正文字符串,并在表达式找到匹配项时返回false。这将是这个样子,它采用了negative lookaround并在这里提供未经测试:

class Opinion < ActiveRecord::Base 
    POLITICAL_WORDS_REGEX = \A((?!Petralha|Tucanos|Dilma).)*\z 

    validates :body, ..., format: { with: POLITICAL_WORDS_REGEX } 
end 

一个潜在的更好的解决办法是使用脏话过滤宝石一样Obscenity,它看起来像它可以让你定义一个政治词汇的字典和自定义验证错误。