DEV Community

Cover image for Let the Tests Design
prumand
prumand

Posted on

Let the Tests Design

I'm currently building myself a personal cli, which helps me integrate coded automation into my daily routines. After some experiments, I though that my next implementation could be here to stay. That's why I started with TDD and after some coding I ended up with the following test for the entrypoint of my typer-app.

@patch("main.get_config")
@patch("main.get_action_factory")
def test_create_action_with_factory(create_action_factory, get_config_mock):
    # Given
    action_factory_mock = MagicMock(spec=ActionFactory)
    create_action_factory.return_value = action_factory_mock
    config_service = ConfigService(action_path=DirectoryPath())
    get_config_mock.return_value = config_service

    # When
    result = runner.invoke(app, ["create-action", "new-action"])

    # Then
    result.exit_code == 0
    create_action_factory.assert_called_once_with(config_service.action_path)
    action_factory_mock.create_action.assert_called_once_with("new-action")

Enter fullscreen mode Exit fullscreen mode

I thought it was a good to idea to let the shell entrypoint handle all the linking together, but there is a lot to mock. All this to answer whether the action_factory was called correctly.
So it's time to let the tests drive the design. I decided to pull out the service creation into a service factory.

pulling out service container

After four commits I get the following code change

-    action_factory = get_action_factory(get_config().action_path)
+    action_factory = get_action_factory()
Enter fullscreen mode Exit fullscreen mode

which allowed simpler test:

@patch("main.get_action_factory")
def test_create_action_with_factory(create_action_factory):
    # Given
    action_factory_mock = MagicMock(spec=ActionFactory)
    create_action_factory.return_value = action_factory_mock

    # When
    result = runner.invoke(app, ["create-action", "new-action"])

    # Then
    result.exit_code == 0
    action_factory_mock.create_action.assert_called_once_with("new-action")
Enter fullscreen mode Exit fullscreen mode

Looks way better. I'll follow up with some more coding done. Let's see what other decisions the tests designed.

Top comments (0)