Last active
December 10, 2019 12:18
-
-
Save ishikawa/2ad8c415c2a5b6a619e99c18870d6392 to your computer and use it in GitHub Desktop.
My preferred way to write parameterized tests in Elixir.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# The helper functions for the test module. To make it possible to import | |
# this helper module in the test module, define this module outside the context that uses it. | |
defmodule MyTest.Helpers do | |
@spec fake_params(Enumrable.t()) :: map | |
def fake_params(override \\ %{}) do | |
%{ | |
country: "jp", | |
phone_number: Faker.phone_number(), | |
locale: "ja", | |
company: "My Company", | |
department: "My Department", | |
email: Faker.Internet.email(), | |
first_name: Faker.Name.first_name(), | |
last_name: Faker.Name.last_name() | |
} | |
|> Map.merge(Map.new(override)) | |
end | |
end | |
defmodule MyTest do | |
use MyApp.ConnCase | |
# Because I'd like to use functions in the helper module both in parameterized cases and | |
# test cases, alias and import it. | |
alias MyTest.Helpers | |
import Helpers | |
describe "signup" do | |
for {description, signup_params} <- [ | |
# You cannot invoke functions in the testing module which is not defined yet. | |
# So we need the helper module. | |
"all filled": Helpers.fake_params(), | |
"department can be omitted": Helpers.fake_params(department: nil), | |
"department can be null": Helpers.fake_params() |> Map.delete("department") | |
] do | |
# You cannot use variables in this context in the context inside a test case. | |
# So you have to use module attributes or `@tag` feature in ExUnit. Personally, | |
# I prefer the latter. | |
@tag signup_params: signup_params | |
test "no errors: #{description}", %{conn: conn, signup_params: signup_params} do | |
# ... | |
end | |
end | |
end | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment