Я довольно новичок в реализации Genserver в Elixir. У меня есть случай, когда я пытаюсь управлять каким-то состоянием, и Genserver отлично работает для этого случая. Но я сталкиваюсь с некоторыми сложностями при тестировании Genserver.
У меня есть два теста, которые, кажется, сталкиваются друг с другом. У меня есть тест модульного уровня для моего Genserver и тест более высокого уровня, где функция, которую я вызываю, использует Genserver с модулем. Вот мои два теста:
ПЕРВОЕ:
defmodule MyApp.ScoreTableQueueTest do
use MyApp.DataCase
alias MyApp.{ScoreTableQueue}
setup do
start_supervised(ScoreTableQueue)
:ok
end
test "pushes value in the queue" do
assert :ok == ScoreTableQueue.push([1,2,3,4])
end
test "pops the full value of the queue" do
assert [[1,2,3,4]] == ScoreTableQueue.pop()
end
end
Если я запускаю это изолированно, оно проходит каждый раз. Но если я проведу этот тест, он будет периодически прерываться:
ВТОРОЙ:
setup do
start_supervised(ScoreTableQueue)
:ok
end
describe "distribute" do
test "it distrbutes the correct season points" do
{:ok, table} = List.first(MyApp.ScoreTableAllocator.distribute())
assert table.table_details.information == [
%{team_id: team_3.id, team_score: "N/A"},
%{team_id: team_2.id, team_score: ps_2.score},
%{team_id: team_1.id, team_score: ps_1.score}
]
assert table.question_id == question.id
assert table.season_id == season.id
end
end
В моей функции distribute/1
Genserver фактически используется. Если я называю этот тест изолированно, он всегда работает нормально. Но когда я запускаю тесты вместе, кажется, что половина времени прерывается, заставляя меня поверить, что я запускаю один и тот же сервер и передаю информацию на один и тот же сервер между тестами.
Мой вопрос: как мне отделить каждый тест друг от друга? Я хочу, чтобы в каждом тесте был совершенно другой сервер для каждого случая, по крайней мере, для каждого файла. Как Эликсир способ достичь этого?