Available in Hex, the package can be installed
by adding factory_ex
to your list of dependencies in mix.exs
:
def deps do
[
{:factory_ex, "~> 0.1.0"}
]
end
Documentation can be found at https://hexdocs.pm/factory_ex.
For defining your own factories just implement schema/0
, repo/0
and
build/0
callback e.g:
defmodule MyFactory do
@behaviour FactoryEx
def schema, do: MySchema
def repo, do: MyRepo
def build(params \\ %{}) do
default = %{
foo: 21,
bar: 42
}
Map.merge(default, params)
end
end
And then using it in your tests as:
# For getting a default parameter struct.
FactoryEx.build(MyFactory)
# For getting a default parameter struct with a modification.
FactoryEx.build(MyFactory, foo: 42)
# For getting a default parameter struct and not validating the changeset
FactoryEx.build(MyFactory, [foo: 42], validate?: false)
# For getting a default parameter map.
FactoryEx.build_params(MyFactory)
# For getting a default parameter map with a modification..
FactoryEx.build_params(MyFactory, foo: 10)
# For getting a default parameter map and not validating the changeset
FactoryEx.build_params(MyFactory, foo: 10, validate?: false)
# For getting multiple default parameter maps
FactoryEx.build_many_params(MyFactory, [foo: 42])
# For getting an invalid parameter maps
FactoryEx.build_invalid_params(MyFactory, [foo: 42])
# For inserting a default schema.
FactoryEx.insert!(MyFactory)
# For inserting a default schema with a modification.
FactoryEx.insert!(MyFactory, foo: 42)
# For inserting multiple default schema
FactoryEx.insert_many!(10, MyFactory, foo: 42)
In order to avoid duplicate data on fields and guarentee unique data, we can use
FactoryEx.SchemaCounter
to generate unique integers to append to our fields.
For example our factory could look like the following:
defmodule MyFactory do
@behaviour FactoryEx
def schema, do: MySchema
def repo, do: MyRepo
def build(params \\ %{}) do
default = %{
foo: FactoryEx.SchemaCounter.next("my_factory_foo"),
bar: FactoryEx.SchemaCounter.next("my_factory_bar")
}
Map.merge(default, params)
end
end
To utilize FactoryEx.SchemaCounter
, we must call FactoryEx.SchemaCounter.start()
in the test/test_helper.exs
file.
FactoryEx comes with a helpful mix command to generate factories into our application
$ mix factory_ex.gen --repo FactoryEx.Support.Repo FactoryEx.Support.Accounts.User
$ mix factory_ex.gen --repo FactoryEx.Support.Repo FactoryEx.Support.{Accounts.{User,Role},Authentication.{Token,Session}}
To read more info run mix factory_ex.gen