rails rspec - 如何检查模型常量?

Mic*_*ant 13 ruby rspec constants

我该怎么做:

it { should have_constant(:FIXED_LIST) }
Run Code Online (Sandbox Code Playgroud)

在我的模型(活动记录)中,我有 FIXED_LIST = 'A String'

它不是db属性或方法,我无法使用responds_tohas_attribute测试它(它们失败).我可以用什么来检查它. - 顺便说一下我安装了shoulda-matchers.

小智 15

根据David Chelimsky的回答,我通过略微修改他的代码来实现这一点.

在文件spec/support/utilities.rb(或spec/support中的其他一些文件)中,您可以放置​​:

RSpec::Matchers.define :have_constant do |const|
  match do |owner|
    owner.const_defined?(const)
  end
end
Run Code Online (Sandbox Code Playgroud)

注意使用"RSpec :: Matchers.define"而不是"matchers"

这允许测试规范中的常量,例如:

 it "should have a fixed list constant" do
    YourModel.should have_constant(:FIXED_LIST)
 end
Run Code Online (Sandbox Code Playgroud)

注意使用"have_constant"而不是"have_const"


Rya*_*wis 10

它看起来有点傻,但是:

describe MyClass do

  it { should be_const_defined(:VERSION) }

end
Run Code Online (Sandbox Code Playgroud)

原因是Rspec对于以be_和开头的方法有"魔术"匹配器have_.例如,it { should have_green_pants }会断言返回的has_green_pants?方法.subjecttrue

以同样的方式,例如it { should be_happy }断言返回的happy?方法.subjecttrue

因此,该示例it { should be_const_defined(:VERSION) }断言const_defined?(:VERSION)返回true.


Dav*_*sky 7

如果您想说have_constant可以为它定义自定义匹配器:

matcher :have_constant do |const|
  match do |owner|
    owner.const_defined?(const)
  end
end

MyClass.should have_const(:CONST)
Run Code Online (Sandbox Code Playgroud)

如果您尝试使用单行语法,则需要确保主题是类(不是实例)或在匹配器中检查它:

matcher :have_constant do |const|
  match do |owner|
    (owner.is_a?(Class) ? owner : owner.class).const_defined?(const)
  end
end
Run Code Online (Sandbox Code Playgroud)

有关自定义匹配器的更多信息,请参见http://rubydoc.info/gems/rspec-expectations/RSpec/Matchers.

HTH,大卫


jef*_*ll2 7

另一种简单地确保常量被定义为 \xe2\x80\x93 的选项,而不用担心它的定义内容:

\n\n
it 'has a WHATEVER constant' do\n  expect(SomeClass::WHATEVER).not_to be_nil\nend\n
Run Code Online (Sandbox Code Playgroud)\n