Testing

Hazwaz provides the module hazwaz.unittest with helpers based on unittest to write unit tests for command line behaviour.

The class hazwaz.unittest.HazwazTestCase can be used instead of unittest.TestCase and works just as its parent: methods whose name start with test are run as individual tests, and you can use all the usual unittest assert methods.

To write a test that runs the command as if from the command line, with certain parameters, you can use the method hazwaz.unittest.HazwazTestCase.run_with_argv() as in the following example:

import hazwaz.unittest

import greeter


class testGreeter(hazwaz.unittest.HazwazTestCase):
    def test_greet_world(self):
        cmd = greeter.Greet()
        stream = self.run_with_argv(cmd, [
            "./greeter.py",
            "world",
        ])

        self.assertEqual(
            stream["stdout"].getvalue(),
            "Hello world!\n"
        )

The first parameter should be the name of the command itself, as if this was the full command line.

If the tests are in their own module, there is a convienence function hazwaz.unittest.main() that runs unittest.main(), to be used e.g.:

if __name__ == "__main__":
    hazwaz.unittest.main()

However, if you’re writing a self-contained script you can use the command hazwaz.unittest.TestCommand to add a subcommand called test which runs all tests from a list of unittest.TestCase:

class Greet(hazwaz.MainCommand):
    """
    Greet people in different ways.
    """
    commands = (
        World(),
        Individual(),
        hazwaz.unittest.TestCommand([TestGreeter]),
    )