.. _exercise_mailroom_mocking: ################ Mocking Mailroom ################ Goal ==== You should now have a nice mailroom program, complete with an object-oriented structure and bundled up into a nice python package. And a complete set of unit tests for the logic code. But your command line user interface code is likely not tested. It's hard to auto-test user-interaction. Your mission is to get mailroom fully tested. Start with your object oriented mailroom in a proper python package. Coverage -------- First, run coverage on your current tests. I like ``pytest-cov``: .. code-block:: bash $ pip install pytest-cov $ pytest --cov=mailroom Or, to get the nifty html output: .. code-block:: bash $ pytest --cov=mailroom --cov-report html That will result in a pile of html in an ``htmlcov`` directory. Point your browser to the ``index.html`` file in there, and click away. Once you've run coverage, add tests to get it up close to 100% on your logic code, if it's not there already. Fixtures -------- Fixtures are a really good way to make your tests cleaner and more independent. With mailroom, you should have a couple fixtures that set up a donor database with some data in it, and maybe one or two for ``Donor`` objects. Clean up your tests with fixtures, and keep the coverage up! One possible use for a fixture is providing a file to write to for the code that writes files. Or maybe a directory to put the files in, and then it can clean up the dir in teardown. Mocking input ------------- Once you have 100% coverage for the logic code, it's time to test the UI. You should be able to use mocking to mock the ``input`` function, and then actually test your user interface code, too. Can you get 100% test coverage?