2013-09-08 18 views
25

Jaki jest poprawny format korzystania z shoulda-matchers i nowego numeru RSpec: expect syntax?shoulda-matchers RSpec oczekują składni

+0

Przepraszam, miałem na myśli, powinienem być – trev9065

+0

Jeśli chodzi o głosowanie na zakończenie, opierając się głównie na opiniach, Uważam, że ten konkretny przypadek pytania, czy coś jest "dobrym pomysłem", jest wyjątkiem, ponieważ istnieje uzasadnienie oparte na faktach, że problem nie dotyczy problemu. –

+0

dokonał edycji szczegółów quesrion, aby był odpowiedni dla SO. –

Odpowiedz

55

Choć można oczywiście użyć shoulda-dopasowujących z nową składnią spodziewać się następująco:

it 'should validate presence of :email' do 
    expect(subject).to validate_presence_of :email 
end 

lub bardziej zwięzły, ale mniej czytelnej:

it { expect(subject).to validate_presence_of :email } 

formatu jednej-liner should te Matchery są zazwyczaj używane, ponieważ są wyraźnie obsługiwane w wersji 2.14, nawet jeśli są to config.syntax == :expect. Kiedy should jest używany z zastrzeżeniem jak w niejawny:

describe User 
    it { should validate_presence_of :email } 
end 

nie polegać na łatanie małpa Kernel że should inaczej zależy.

Jest to objęte https://github.com/rspec/rspec-expectations/blob/master/Should.md. W rzeczywistości dokumentacja ta wykorzystuje nawet powyższy przykład matchera do zilustrowania tego wyjątku.

Zobacz także Using implicit `subject` with `expect` in RSpec-2.11, która omawia opcję konfiguracji, która pozwala używać jako alternatywy dla it.

expect_it { to validate_presence_of :email } 

Aktualizacja: Jak z RSpec 3.0 (beta2), będzie również mieć możliwość korzystania z:

it { is_expected.to validate_presence_of :email } 
+0

Pierwszy blok będzie również otoczony przez 'desribe User', prawda? Wygląda to jak porównanie 3 linii z 3 różnymi liniami, ale nie do końca. Jeśli tak, to może chcieć dodać to dla jasności w pierwszym bloku kodu. –

+0

@MichaelDurrant Tak, to by było. Zgoda. Dzięki za wskazanie tego. Odpowiedź zaktualizowana. –

+0

Ktoś ma pojęcie o tym, po co jest downvote? Czy jest to związane z bliskimi głosami, ponieważ jest to "głównie oparte na opiniach"? –

0

będę Suplement Odpowiedź @ peter-alfvin. W przypadku testowania modelu i jego migrację się z shoulda-matchers nie można używać :expect poza it bloku, więc nie można napisać:

RSpec.describe ModelName, type: :model do 
    expect(subject).to belong_to(:user) 
end 

I dostaniesz expection:

`expect` is not available on an example group (e.g. a `describe` or `context` block). 

ale poprawna wersja to:

RSpec.describe ModelName, type: :model do 
    it { expect(subject).to belong_to(:user) } 
end