Masa331 blogging

my-photo

Hi, i'm Premysl Donat and this is my blog about IT and my life in generall. I work at UOL and in my free time.. well, look at my Github.

Have a good one!

Menu

Toto je repost mého článku z 7.1.2015 na Bonobo Blogu zde: https://blog.bonobo.cz/2015/02/10/rspec-around-filter/.

Pozor na RSpec < 3.1 a jeho around filter - 10.2.2015(repost)

TDD zná asi každý. Na následující situaci Vám ukážu, proč by se neměla přeskakovat jeho první fáze - fail-test, a proč byste měli upgradovat RSpec na verzi > 3.1.

Potřebovali jsme do aplikace přidat odeslání interního e-mailu. Práce tak na deset minut. Abych kvůli tomu nemusel vytvářet samostatný test-case, přilepil jsem jeden expect do již existujícího testu. Po spuštění testu jsem byl velice překvapený, když všechno v pořádku prošlo.

Po chvíli jsem přišel na to, že je úplně jedno, jaké expecty do testu dám, vždy projdou. Pak jsem objevil zajímavou věc. Kolem daného testu se používal následující RSpec around hook:


around { some_code }
          

Ten když jsem zakomentoval, tak test začal správně failovat. Z dokumentace jsem následně zjistil, že around hook používám špatně. Around hook totiž funguje na jiném principu, než before a after hooky. Bohužel to mě při prvotní implementaci testu vůbec nenapadlo. Hook jako hook, myslel jsem, že se daný kód prostě provede před i po testu. To ale neplatí. V around hooku musíte totiž test case explicitně spustit.

Správné použití:


around do |example|
  some_code
  example.run
  some_code
end
          

Pokud použijete around hook jako v prvním případě, tak se test vůbec nespustí, i když hlásí, že přošel na zelenou.

Naštěstí od verze RSpecu > 3.1 toto špatné použití RSpec detekuje a nespuštěné testy hlásí jako pending i s důvodem. Takže u všech Vašich aplikací doporučuji RSpec aktualizovat nebo minimálně ručně zkontrolovat.

Jinak tenhle příklad krásně ukazuje důležitost první fáze TDD, tedy napsání fail testu. Pokud bych rovnou udělal funkcionalitu a test až později, vůbec bych nemusel přijít na to, že něco nefunguje, protože přeskočený test by mi stále hlásil success.