Christian Grobmeier wrote:
I am looking over possible testcases at the moment.
We have a MailAppender which creates mails on event. How can we test
this? Do we have an "test mail account"? How can we deal with delays
in mailing, when Continuus Int. is on?
The result of unit testing email sending isn't worth much for the
receiver so maybe we should create a mock object [1] here? I've not used
it extensively.
Similar questions occur on SocketAppender or on
DailyRollingFileAppender or Syslog or PHP appender. Any ideas how
testcases can look here?
1) LoggerAppenderPhp uses trigger_error() to raise PHP user errors. To
catch these messages you need to define an error handler with
set_error_handler() [2] (you should probably call
restore_error_handler() [3] afterwards).
2) LoggerAppenderSocket is a bit more complicated. It uses fsockopen()
to connect to a socket. I have written an example using
PEAR::Net::Server [4] (see examples/client.php and examples/server.php)
that I've used as a experimental central logging server before. I think
it's possible to write a unit test case here which startup the socket
server and connect with a client (but you need to manage two different
processes here which is hard in PHP, I only know about the
pcntl-extension [] used for spawning processes on *nix). If you write a
test case for this remember to use self::markTestSkipped('With some
useful message'); [6] if the test case is unable to run because of
missing dependencies.
3) LoggerAppenderDailyFile should be possible to test by setting the
date pattern (with LoggerAppenderDailyFile::setDatePattern) to different
things and check the outcome.
4) LoggerAppenderRollingFile should be possible to test by setting the
maximum filesize (with LoggerAppenderRollingFile::setMaxFileSize) to
something useful and do some logging that results in rolling files.
5) LoggerAppenderSyslog I would say is ok to use directly and check the
syslog file? Maybe we can workaround this and pipe syslog messages
somewhere else not to mess up the syslog on the machine?
Remember to write any temporary data into target/test (not within)
src/test/php (I just saw that the LoggerAppenderPDOTest is writing and
deleting a temporary sqlite database inside src/test/php/appenders).
Hope this helps! :)
Knut
[1] http://www.phpunit.de/manual/3.2/en/mock-objects.html
[2] http://php.net/set_error_handler
[3] http://php.net/restore_error_handler
[4]
http://svn.apache.org/viewvc/incubator/log4php/trunk/src/examples/php/server.php?view=markup
[5] http://php.net/pcntl
[6] http://www.phpunit.de/manual/3.3/en/incomplete-and-skipped-tests.html