我在我的ActiveRecord中有以下验证。
validates :active, :inclusion => {:in => ['Y', 'N']}
我正在使用以下内容来测试我的模型验证。
should_not allow_value('A').for(:active)
should allow_value('Y').for(:active)
should allow_value('N').for(:active)
有没有更干净、更全面的测试方法?我目前正在使用RSpec2和shoulda matchers。
编辑
经过一些搜索,我发现只有这种可能是“好”的测试方法,shoulda没有为此提供任何东西,任何需要它的人都可以为其编写自己的自定义匹配器(并可能将其贡献回项目)。一些可能有趣的讨论链接:
it { should_not allow_value('?').for(:active) }
-- 就像您所说的那样,您无法检查所有可能的值,但是除了检查所有允许的值之外,这样做似乎是合理的覆盖范围。 - bjnorddisallows_value_outside_of_array?
。请参见旧版 https://github.com/thoughtbot/shoulda-matchers/blob/v1.2.0/lib/shoulda/matchers/active_model/ensure_inclusion_of_matcher.rb#L86 与现在的 https://github.com/thoughtbot/shoulda-matchers/blob/15abdf066732828034efea751c2937aa81d080fe/lib/shoulda/matchers/active_model/ensure_inclusion_of_matcher.rb#L90 - Nathan Longshoulda-matchers v2.7.0
开始,此语法已被弃用。新的首选语法使用RSpec 3.0expect
语法,如下所示:expect(subject).to validate_inclusion_of(:active).in_array(%w[Y N])
。 - Nathan Wallaceensure_inclusion_of
,现在是validate_inclusion_of
。 - Nathan Wallaceshoulda-matchers
的警告:您正在使用“validate_inclusion_of”来断言布尔列允许布尔值并禁止非布尔值。请注意,无法完全测试此功能,因为布尔列将自动将非布尔值转换为布尔值。因此,您应该考虑删除此测试。 - Joshua Pinter