I’ve got a function/action called
upload_file in my controller. Inside that function I call
parse_and_insert_from_file context function which does inserting stuff into the DB from the file.
def upload_file(...) do
Is it enough to test the
upload_file action or should I also test
parse_and_insert_from_file function in my context test?
For example is it enough testing
file_upload_controller_test.exs or should I also test
save_file function in
upload_context_test.exs by mocking the contents of the file?
I am just not really experienced enough to tell what to test where yet but what I would do is to only test the action
upload_file and I would say that’s enough since that action is already using that function.
What would be your opinion?
The biggest challenge with testing file upload is to have a file to upload and if that upload goes to the third party (eg S3). In the case of a third party, you should mock in test automation.
If there is not the third party, a mock is not needed.
This function helps a lot for file generation:
Regarding the layers, it is always easier to mock closer to the save_file function.
What to test? Just cover all code paths (Elixir conditions, error codes) in your test files, starting from lower layers (closer to the database) towards the controller layer. So for example, if you have
case statement in
save_file, then write a test for that in
So what you’re saying is basically I need to test both, right? For example if I’ve got that
case statement and I test it in
upload_context_test, since an action like
file_upload_controller will be using that function. Should I also test the same thing (or error to be specific) for my action in
In controller layer, just test for errors that are pattern matched in the controller. If you only pattern match errors in
upload_file then just test in that context.
I found that developers in Phoenix code only pattern match errros in controller, not in layer that uses Ecto library. I found this good approach, because doing that you do not duplicate error pattern matching.