istě jste také už mnohokrát, stejně jako já,
řešili problém, jak spolehlivě automaticky otestovat,
že vaše aplikace správně odeslala email s konkrétním
obsahem na konkrétní emailovou adresu. Problém je to
zapeklitý a dosud jsem ho dokázal řešit jen těmito
způsoby:

  • udáním testovací schránky a automatickým výběrem
    této schránky (např. přes protokol POP3)
  • vytvořením mock objektu, který mi zastoupil
    třídu starající se o odeslání emailu (tzn. k
    žádnému emailu fyzicky v testu nedošlo)

Oba dva přístupy mají svá úskalí. Ten první velmi
komplikuje běh testu – musíme naprogramovat další
funkcionalitu, která nám vybere emaily jiným
protokolem, musíme řešit možnost, že se email někde
pozdrží, musíme fyzicky nějakou schránku mít, musíme
vyřešit to, jak při opakovaném spouštění testů
rozeznáme, že do schránky přišel právě ten mail, na
kterém v testu čekáme. Fakticky se potom často stane,
že v testu samotném je víc chyb, jak v tom
jednoduchém kódu, který se snažíme otestovat.

Druhý přístup je jednodušší a test s ním obvykle
po vyladění spolehlivě prochází. Nicméně tento
přístup nezaručuje, že v reálném nasazení,kdy místo
mock objektu, bude skutečný objekt zajišťujicí
odeslání emailu nedojde k chybě (např. díky tomu, že
náš mock objekt nedostatečně dobře imituje chování
reálného objektu).

Do této doby jsem tedy odesílání emailů ověřoval
“ručně”. Automatické testy sice odesílaly emaily, ale
ty šly na moji schránku a v ní jsem zkontroloval,
jestli očekávaný email v očekávané době došel. Skvělá
věc, když spouštíte testy ručně, ovšem horší v
případě, že vám testy spouští integrační server. To
se vaše schránka pěkně plní a vy stejně nemáte šanci
vyhodnotit, zda je vše jak má.