0

配列に含まれる要素のクラスでアサートしたかったので、次の方法を試しました。

これは機能しませんが、見栄えがよく読みやすいです。

["String", :symbol, Object.new].should =~ [an_instance_of(String), an_instance_of(Symbol), an_instance_of(Object)]

しかし、次のエラーが表示されます:

Failure/Error: ["String", :symbol, Object.new].should =~ [an_instance_of(String), an_instance_of(Symbol), an_instance_of(Object)]
   expected collection contained:  [#<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x007f9e6a33dbe0 @klass=String>, #<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x007f9e6a33dbb8 @klass=Symbol>, #<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x007f9e6a33db68 @klass=Object>]
   actual collection contained:    ["String", :symbol, #<Object:0x007f9e6a33dca8>]
   the extra elements were:        ["String", :symbol, #<Object:0x007f9e6a33dca8>]

欠落している要素がないことに注意してください。

これは機能しますが、ハックに見えます:

["String", :symbol, Object.new].collect{|x| x.class}.should =~ [String, Symbol,Object]
  1. 同じことを主張するより良い方法はありますか?
  2. 最初の方法で欠落要素がないのはなぜですか?
4

2 に答える 2

3

&:classブロックの代わりに使用できます。

["String",:symbol,Object.new].map(&:class).should =~ [String,Symbol,Object]

これは同じ結果になりますが、より読みやすくなります。

また、メソッドmapの短いエイリアスである whichを使用しました。collect

于 2013-01-08T23:21:45.510 に答える
2

2番目の部分への答えは、「欠落している要素がないことに注意してください」というあなたの主張にかかっています。欠落している要素あります。

これ:

expected collection contained:  [#<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x007f9e6a33dbe0 @klass=String>, #<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x007f9e6a33dbb8 @klass=Symbol>, #<RSpec::Mocks::ArgumentMatchers::InstanceOf:0x007f9e6a33db68 @klass=Object>]

これと同じではありません:

the extra elements were:        ["String", :symbol, #<Object:0x007f9e6a33dca8>]

1つ目はクラスのインスタンスのモックオブジェクトを含み、2つ目はクラスのインスタンスを含みます。マッチャーはこのinstance_ofように使用されることは想定されていませんが、これを行いますか?

["String", :symbol, Object.new].should =~ [respond_to(:gsub), respond_to(:intern), respond_to(:object_id)]

配列をテストするか、配列 内容にそれぞれ何らかの属性があるため、意味がありません。あなたがしたことは、2つのテストを混同することであり、それを行うことで両方に問題が発生しました。

subject { instance }
["String", :symbol, Object.new].each do |thing|
  let(:instance) { thing.class }
    if instance.class == String
      it{ should respond_to(:gsub) }
    else #...

もっと似たようなものですが、これはとにかくコード/デザインの匂いだと思います-なぜ同じ配列にそのような異なるものがあるのでしょうか?仕様を定め、テストし、処理することは困難です。

于 2013-01-09T18:49:33.003 に答える