I run my unit tests with mix test --no-start
, as I don’t want my application to start when I run my unit tests. However, I also want to test some code that uses Timex for a calculation. If I naively attempt to use Timex in my test, I get the following
test "can get next instance of time in a trivial instance" do
next_occurrence =
Util.Time.get_next_occurrence_of_time(~D[2022-01-01], ~T[13:37:00], "America/New_York")
assert next_occurrence == Timex.to_datetime({{2022, 1, 1}, {13, 37, 0}}, "America/New_York")
end
1) test get_next_occurrence_of_time can get next instance of time in a trivial instance (PillminderTest.Util.Time)
test/pillminder/util/time_test.exs:8
** (ArgumentError) errors were found at the given arguments:
* 1st argument: the table identifier does not refer to an existing ETS table
code: assert next_occurrence == Timex.to_datetime({{2022, 1, 1}, {13, 37, 0}}, "America/New_York")
stacktrace:
(stdlib 3.17.2.1) :ets.lookup(:tzdata_current_release, :release_version)
(tzdata 1.1.1) lib/tzdata/release_reader.ex:74: Tzdata.ReleaseReader.current_release_from_table/0
(tzdata 1.1.1) lib/tzdata/release_reader.ex:17: Tzdata.ReleaseReader.simple_lookup/1
(tzdata 1.1.1) lib/tzdata/release_reader.ex:9: Tzdata.ReleaseReader.zone_and_link_list/0
(tzdata 1.1.1) lib/tzdata.ex:61: Tzdata.zone_exists?/1
(timex 3.7.9) lib/timezone/timezone.ex:230: Timex.Timezone.name_of/1
(timex 3.7.9) lib/timezone/timezone.ex:262: Timex.Timezone.get/2
(timex 3.7.9) lib/timezone/timezone.ex:585: Timex.Timezone.convert/2
(timex 3.7.9) lib/datetime/erlang.ex:46: Timex.Protocol.Tuple.to_datetime/2
test/pillminder/util/time_test.exs:12: (test)
I can understand why this might be; tzdata
likely needs to be started in order to read from this ETS table. I’m not sure the best way to fix this, because
- If I remove
--no-start
, my application will start, which has side effects I don’t want to produce just by running my unit tests. - Even if I somehow prevent my application from running (is there a way?), but allow Timex to run
tzdata
, I’m still going to have side effects in my tests, Timex will need to update the timezone database before running my tests; I try to keep my unit tests free of network calls wherever I can.
How can I best deal with this? Is perhaps there some way I can “mock” the tzdata, or somehow pre-seed it for my unit tests?
Thanks!