Rspec: Zou (dit of dat) moeten zijn

Wat zou de beste manier zijn om de Rspec te schrijven in een situatie waarin een van de twee (of meer) uitkomsten acceptabel zijn?

Hier is een voorbeeld van wat ik wil doen. Dit is natuurlijk verkeerd (denk ik), maar het zou je de essentie moeten geven van wat ik probeer te bereiken:

it "should be heads or tails" do
  h="heads"
  t="tails"
  flip_coin.should be(h || t)
end

En ja, ik ben me ervan bewust dat ik mijn eigen rspec-matcher "should_be_one_or_the_other (option1, option2)" kon schrijven, maar dat lijkt een beetje veel - ik hoopte op een betere oplossing.

26

5 antwoord

ActiveSupport biedt de Object # in? methode. U kunt het combineren met RSpec en eenvoudig het volgende gebruiken:

flip_coin.should be_in(["heads", "tails"])

Of met de nieuwe syntaxis van Rspec 3:

expect(flip_coin).to be_in(["heads", "tails"])
28
toegevoegd
Kleine correctie: ActiveSupport definieert #in? op Object , niet op Array , omdat het zo wordt genoemd flip_coin.in? % w (heads-tails) en flip_coin kunnen elk Object zijn.
toegevoegd de auteur Dave Schweisguth, de bron
bedankt voor de feedback
toegevoegd de auteur Sergey Potapov, de bron
Dit werkte niet voor mij in de nieuwste versie, ik moest er eerst een array van maken be_in (["heads", "tails"])
toegevoegd de auteur Vox, de bron

Ik weet dat dit oud is, maar toen ik dit tegenkwam op RSpec 3.4, is er een of keyword nu. Dus dit is geldig:

expect(flip_coin).to eq('heads').or(eq('tails'))
19
toegevoegd

Ik zou waarschijnlijk zoiets schrijven als dit:

it "should be heads or tails" do
  ["heads", "tails"].should include flip_coin
end
14
toegevoegd
Ja, helemaal verkeerd, maar zeker de schoonste syntaxis
toegevoegd de auteur idrinkpabst, de bron
Een goede optie, maar het lijkt erop dat het de juiste "rspec" manier om dingen te doen ondermijnt, met de verwachte waarde aan de rechterkant.
toegevoegd de auteur GlyphGryph, de bron

Een andere manier om het te schrijven met de verwachting aan de rechterkant van het:

it 'should be heads or tails' do
  flip_coin.should satisfy{|s| ['heads', 'tails'].include?(s)}
end
11
toegevoegd

indien toegepast of met zijn matcher

expect(flip_coin).to eq('heads').or(be == 'tails')
2
toegevoegd
Ik vind dit minder intuïtief dan het antwoord met "of" vanaf dec. 15.
toegevoegd de auteur Dave Newton, de bron