2013-08-12 11 views
26

Jaka jest różnica między następującymi wierszami kodu (rspec) i niezależnie od tego, czy są one takie same czy różne, kiedy należy używać jednego z nich zamiast drugiego?Pozwól kontra Stub, co za różnica?

book = double("book") 
allow(book).to receive(:title) { "The RSpec Book" } 

kontra

book = double("book") 
book.stub(:title).and_return("The RSpec Book") 

Odpowiedz

30

Są 2 różnice, ale wynik jest dokładnie taki sam. Oba są w odniesieniu do składni rpec mocks/expect.

  1. Używanie #allow zamiast #stub. Pierwszy przypadek wykorzystuje nową składnię rspec wprowadzoną w tym roku. Jest to obecnie preferowany sposób korzystania z programu rspec. Mimo że stara składnia nie jest przestarzała, prawdopodobnie zostanie wyłączona domyślnie w rspec3. Więcej informacji na ten temat od opiekuna RSpec: http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax http://myronmars.to/n/dev-blog/2013/07/the-plan-for-rspec-3

  2. Zastosowanie bloku zamiast #and_return do określenia wartości Skrutacyjnej. Nie ma to nic wspólnego ze wspomnianą zmianą składni; oba podejścia są dostępne od dłuższego czasu (od rspec 1). Bardziej odpowiednie jest użycie metody #and_return, ponieważ jest to (a) metoda domyślna, (b) bardziej czytelna i (c) pojawia się bez żadnych nakładów na środowisko wykonawcze. Drugie podejście do bloku jest zwykle zarezerwowane dla przypadków narożnych, gdy chcesz zwrócić coś bardziej dynamicznego - nie stałą, ale pewnego rodzaju obliczenia.

Odpowiedź na pytanie byłoby użyć kombinacji obu:

  • użyć #allow zamiast #stub
  • użycie #and_return zamiast bloku, chyba trzeba wrócić dynamicznie obliczona wartość

Np

book = double('book') 
allow(book).to receive(:title).and_return('The RSpec Book') 
+1

'rspec-mocks' REAME wydaje się wymieniać tylko' allow'. Uważam, że dziwne, ponieważ 'MyClass.stub (bla: 20)' jest bardziej zwięzły niż 'allow (MyClass) .to receive (: blah) .and_return (20)'. – gylaz

+1

@gylaz Przeczytaj [pierwszy artykuł] (http://myronmars.to/n/dev-blog/2012/06/rspecs-new-expectation-syntax) w tej odpowiedzi. Daje dobry przegląd przyczyny, dla której zezwolenie/oczekiwanie jest lepsze. tl; dr: starsza składnia jest skłonna do wywoływania dziwnych, mylących niepowodzeń. Nowa składnia rozwiązuje te problemy, zachowując wysoką czytelność. – Andrew

Powiązane problemy