2012-02-20 13 views
8

Mam kilka skryptów, które rozpocząłem testowanie jednostkowe przy użyciu pomysłu "modulino". Napotkałem problem polegający na tym, że gdy skrypt jest wywoływany z "perl -d", skrypt nie działa jako wywołujący() zwraca wartość true.Wydanie Perla -d i modulino

Mam główny korpus skryptu zawinięty w main(), a niektóre podprogramy są powoli wyciągane z głównego() do własnych podprogramów.

Na początku skryptu mam:

main(@ARGS) unless caller(); 

Wywołany w .T testów to działa jak chcę, nie działa main(), więc mogę przetestować podprogramów. Kiedy wywołuję skrypt z CLI działa świetne wywoływanie main().

Problem pojawia się, gdy nazywam go z CLI z:

perl -d myscript.pl 

Na tym etapie rozmówcy zwraca poprawną wartość (zamiast undef) i główny nie jest tzw.

Sugestie byłyby bardzo cenne, jeśli chodzi o podejście do tego.

+2

Dobry połów. Nigdy bym tego nie rozważał, ponieważ rzadko używam debuggera Perla. Dzięki, :) –

+0

Nie mogę odtworzyć tego zachowania. Napisałem małe modulino, a debugger nadal działa dobrze. Czy możesz wysłać przykład? – cjm

+0

Powinien być "@ ARGV" zamiast "@ ARGS". Na wypadek, gdyby ktoś po prostu kopiował wklejanie :) – famousgarkin

Odpowiedz

8

Sytuacja z przełącznikiem -d jest podobna jak przy testowaniu - Twój kod jest wykonywany przez coś innego, w tym przypadku debuggera.

Możesz samemu uruchomić main, wywołując go ręcznie w debugerze lub musisz sprawdzić, czy debugger jest caller. Coś jak:

main(@ARGS) if !caller() || (caller)[0] eq 'DB'; 
+2

Twój stan jest zły. Jeśli 'caller' ma wartość true, to drugi warunek nigdy nie zostanie oceniony. Spróbuj 'until caller i (caller) [0] ne 'DB''. – cjm

+2

@cjm - dzięki, naprawione. Zmieniłem stan na pozytywny, ponieważ zajęło mi to trochę czasu, aby to rozgryźć. – bvr

+0

To wygląda dobrze. Spróbuję tego i opublikuję moje wyniki. Dzięki! – LanceW