我如何使用RSpec测试Rails中的包含验证

jak*_*ake 39 shoulda rspec-rails ruby-on-rails-3

我的ActiveRecord中有以下验证.

validates :active, :inclusion => {:in => ['Y', 'N']}
Run Code Online (Sandbox Code Playgroud)

我使用以下来测试我的模型验证.

should_not allow_value('A').for(:active)
should allow_value('Y').for(:active)
should allow_value('N').for(:active)
Run Code Online (Sandbox Code Playgroud)

是否有更清洁,更通过测试方式?我目前正在使用RSpec2和shoulda匹配器.

编辑

经过一些环顾四周我才发现,这可能是一种'好'的测试方式,如果没有为此提供任何东西,任何需要它的人都可以为它编写自己的自定义匹配器.(并可能将其贡献给项目) .可能有趣的讨论的一些链接:

  • 链接表明上述内容.链接1,链接2

  • should_ensure_value_in_range这个接近可以使用的,但只接受范围而不是值列表.自定义匹配器可以基于此.

Nat*_*ong 63

使用shoulda_matchers

在最新版本shoulda-matchers(至少从v2.7.0开始)中,您可以:

expect(subject).to validate_inclusion_of(:active).in_array(%w[Y N])
Run Code Online (Sandbox Code Playgroud)

这测试验证中可接受值的数组与此规范完全匹配.

在早期版本中,> = v1.4,shoulda_matchers支持以下语法:

it {should ensure_inclusion_of(:active).in_array(%w[Y N]) }
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,当使用此布尔值运行测试套件时,我收到以下警告:`来自 shoulda-matchers 的警告:您正在使用“validate_inclusion_of”来断言布尔列允许布尔值并不允许非布尔值。请注意,不可能完全测试这一点,因为布尔列会自动将非布尔值转换为布尔值。因此,您应该考虑删除此测试。 (2认同)

nmo*_*ott 25

如果您要测试的元素多于布尔Y/N,那么您也可以尝试.

it "should allow valid values" do
  %w(item1 item2 item3 item4).each do |v|
    should allow_value(v).for(:field)
  end
end
it { should_not allow_value("other").for(:role) }
Run Code Online (Sandbox Code Playgroud)

您还可以%w()使用模型中定义的常量替换它,以便测试只允许常量值.

CONSTANT = %w[item1 item2 item3 item4]
validates :field, :inclusion => CONSTANT
Run Code Online (Sandbox Code Playgroud)

然后测试:

it "should allow valid values" do
  Model::CONSTANT.each do |v|
    should allow_value(v).for(:field)
  end
end
Run Code Online (Sandbox Code Playgroud)