[Tutor] How to write tests for main() function that does not return anything
Peter Otten
__peter__ at web.de
Wed Feb 3 04:18:13 EST 2016
Pedro Miguel wrote:
> Hi guys, I'm trying to test the code in the main() but I'm a bit unsure
> how to go about it since I'm not passing any arguments or even returning
> anything other then logging. For the purposes of the example I've
> shortened the tree statements in the function.. Can anyone point me in the
> right direction on how to test the logic below? Or perhaps give me an
> example on how to test the code below (that would be really appreciated).
> I've posted this question on Stackoverflow but the guys over there told me
> to mock it but no one provided an example (I'm fairly new on mocking)..and
> how could I mock the if statements or even the for loop? script.py
>
> from . import settings
>
>
> def main():
> if settings.PATHS: # list containing full paths to a directory of
> files
> paths = settings.PATHS
> for path in paths:
> data = read_file(path)
> modified_data = do_something_with_the_data_collected(data)
> write_to_new_file(modified_data)
> else:
> logger.warning("There are no files in
> {}".format(settings.FILES_DIRECTORY))
>
> if __name__ == '__main__':
> main()
> tests/file_tests.py
> import unittest
>
> from module.script import main
>
>
> class FileManagerTests(unittest.TestCase):
>
> def test_main_func(self):
> main() # ?? this is where I am stuck, should I just test
> # that it logs correctly if certain data exists
> # in settings file?
>
> if __name__ == '__main__':
> unittest.main()
>
> RegardsPedro+44(0)7549646235pedro.miguel at live.co.uk
Keep it simple and avoid mocking. Instead set up some test input data and a
script that compares the actual with the expected output. If in addition you
refactor the code in main in such a way that the building blocks can easily
be tested with conventional unit tests you get better coverage for less
effort.
Here's how main() might look after refactoring:
def main():
if not process_files(settings.PATHS):
logger.warning(...)
def process_files(paths):
has_files = False
for path in paths:
has_files = True
process_file(path)
return has_files
def process_file(path):
...
More information about the Tutor
mailing list