どうすれば次のようなことができますか:
it { should have_constant(:FIXED_LIST) }
私のモデル(アクティブなレコード)にはFIXED_LIST = 'A String'
これは db 属性またはメソッドではなく、使用responds_to
もhas_attribute
テストもできませんでした (失敗します)。を使用して確認できます。-ところで、shoulda-matchers がインストールされています。
David Chelimsky's answer に基づいて、彼のコードを少し変更することでこれを機能させました。
ファイル spec/support/utilities.rb (または spec/support 内の他のファイル) に次のように記述できます。
RSpec::Matchers.define :have_constant do |const|
match do |owner|
owner.const_defined?(const)
end
end
「マッチャー」の代わりに「RSpec::Matchers.define」を使用していることに注意してください。
これにより、次のような仕様の定数をテストできます。
it "should have a fixed list constant" do
YourModel.should have_constant(:FIXED_LIST)
end
「have_const」の代わりに「have_constant」を使用していることに注意してください。
少しばかげていますが、次のとおりです。
describe MyClass do
it { should be_const_defined(:VERSION) }
end
be_
その理由は、Rspec にはand で始まるメソッドの「魔法の」マッチャーがあるためですhave_
。たとえば、 のメソッドが を返すit { should have_green_pants }
とアサートします。has_green_pants?
subject
true
同様に、 のメソッドが を返すit { should be_happy }
ことをアサートするような例。happy?
subject
true
したがって、この例は を返すit { should be_const_defined(:VERSION) }
ことをアサートします。const_defined?(:VERSION)
true
have_constant
カスタムマッチャーを定義できると言いたい場合は、次のようにします。
matcher :have_constant do |const|
match do |owner|
owner.const_defined?(const)
end
end
MyClass.should have_const(:CONST)
ワンライナー構文を使用しようとしている場合は、サブジェクトがクラス (インスタンスではない) であることを確認するか、マッチャーで確認する必要があります。
matcher :have_constant do |const|
match do |owner|
(owner.is_a?(Class) ? owner : owner.class).const_defined?(const)
end
end
カスタムマッチャーの詳細については、 http://rubydoc.info/gems/rspec-expectations/RSpec/Matchersを参照してください。
HTH、デビッド
あなたが使うことができます
defined? YOUR_MODEL::FIXED_LIST
RSpec 2 では、次のように 1 行でこれを機能させることができました。
it { subject.class.should be_const_defined(:MY_CONST) }
つまり、インスタンスではなく、クラスに対してチェックします。