web-dev-qa-db-fra.com

RSpec: Comment pourrais-je utiliser le tableau include matcher dans la syntaxe attendue

J'utilise nouvelle syntaxe rspec (expect au lieu de should) et je voudrais tester si un tableau comprend des éléments d'un autre tableau. Dans l'ancienne syntaxe, ce serait:

array1.should include(array2)

Dans la nouvelle syntaxe, j'ai essayé d'écrire:

expect(array1).to include(array2)

mais j'ai une erreur (c'est tout à fait raisonnable):

TypeError: wrong argument type Array (expected Module)

Alors j'ai écrit:

expect(array1).to be_include(array2)

mais c'est moche ;-) MISE À JOUR: et cela n'a pas fonctionné: apparemment, ça cheks si array2 est élément de array1 pas si tous les éléments de array2 sont inclus dans array1.

Enfin j'ai écrit:

expect(array1 & array2).to eq(array2)

mais ce n'est pas la plus jolie solution. Le savez-vous mieux?

40
mrzasa

Essaye celui-là:

expect(array1).to include *array2
5
William Hu

Pour tester si un tableau est un sous-ensemble d'un autre tableau, il est préférable d'introduire set . Et puis vous pouvez l'écrire comme ceci ... (La solution utilise Set # subset? )

require "set"

describe "Small test" do
  let(:array1) { %w{a b c d} }
  let(:array2) { %w{b c} }

  let(:array1_as_set) { array1.to_set }
  let(:array2_as_set) { array2.to_set }

  subject { array2_as_set }

  context "inclusion of w/ \"expect\"" do
    it { expect(subject).to be_subset(array1_as_set) }
  end

  context "inclusion of w/ \"should\"" do
    it { should be_subset(array1_as_set) }
  end

end
3
Oto Brglez