16

どうすれば次のようなことができますか:

it { should have_constant(:FIXED_LIST) }

私のモデル(アクティブなレコード)にはFIXED_LIST = 'A String'

これは db 属性またはメソッドではなく、使用responds_tohas_attributeテストもできませんでした (失敗します)。を使用して確認できます。-ところで、shoulda-matchers がインストールされています。

4

8 に答える 8

18

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」を使用していることに注意してください。

于 2012-12-17T15:22:49.607 に答える
10

少しばかげていますが、次のとおりです。

describe MyClass do

  it { should be_const_defined(:VERSION) }

end

be_その理由は、Rspec にはand で始まるメソッドの「魔法の」マッチャーがあるためです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

于 2013-04-16T23:41:09.130 に答える
8

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、デビッド

于 2012-07-05T04:35:15.547 に答える
1

あなたが使うことができます

defined? YOUR_MODEL::FIXED_LIST
于 2012-07-05T03:57:16.280 に答える
1

RSpec 2 では、次のように 1 行でこれを機能させることができました。

it { subject.class.should be_const_defined(:MY_CONST) }

つまり、インスタンスではなく、クラスに対してチェックします。

于 2016-03-24T21:37:15.923 に答える