Я пытаюсь протестировать функцию устранения неполадок в своем приложении Elm и не могу понять, как это сделать.
Отладка применяется к текстовому полю для нечеткого поиска, чтобы избежать слишком большого количества HTTP-запросов, она смоделирована на этом примере https://ellie-app.com/jNmstCdv3va1 и следует той же логике.
type alias Model =
{ search : Maybe String
, searchResult : List User
, debouncingCounter : Int
}
init : Model
init =
{ search = Nothing
, searchResult = []
, debouncingCounter = 0
}
debounceTime : Time
debounceTime = 350 * Time.millisecond
update : Msg -> Model -> (Model, Cmd Msg)
update msg model =
case msg of
(...)
SearchInput search ->
let
newCounter = model.debouncingCounter + 1
in
case search o
"" -> ({model | search = Nothing, searchResult = []}, Cmd.none)
_ ->
({ model | search = Just search, debouncingCounter = newCounter }
, Process.sleep debounceTime |> Task.perform (always (Timeout newCounter)))
Timeout int ->
if int==model.debouncingCounter then
(update SendSearch {model | debouncingCounter = 0 })
else
(update NoOperation model)
SendSearch ->
case model.search of
Nothing ->
(model, Cmd.none)
Just string ->
let
cmd = Http.send ReSendSearch <| postApiAdminUserSearchByQuery string
in
(model, cmd)
ReSendSearch result ->
case result of
Err _ ->
(model, Cmd.none)
Ok usersList ->
({model | searchResult = usersList}, Cmd.none )
Я хочу убедиться, что после звонка
update (searchInput "string") init
запрос Http отправляется только после debounceTime.
Я могу легко протестировать модель сразу после вызова функции обновления с сообщением searchInput. Например, здесь я проверяю, что начальное значение поля "debouncingCounter" в модели установлено на 1:
startDebounce : Test
startDebounce =
test "debouncingCounter is set to 1 after search input is updated" <|
\_ ->
Users.init
|> Users.update (Users.SearchInput "abc")
|> Tuple.first
|> .debouncingCounter
|> Expect.equal 1
Однако я не понимаю, как я смогу проверить влияние отложенного сообщения Cmd Msg на модель, поскольку я не могу напрямую применить значение cmd, возвращаемое функцией обновления.
Process.sleep debounceTime |> Task.perform (always (Timeout newCounter))
Кажется, что разные способы реализации устранения неполадок не решат проблему, поскольку все они полагаются на командные сообщения.





В зависимости от того, что именно вы хотите протестировать, вы можете использовать разные подходы.
Если вы хотите протестировать
Ваш код на SearchInput возвращает правильную команду: вы можете рассмотреть возможность использования elm-testable.
Среда выполнения elm правильно выполняет команду Process.sleep: попадет в интеграция / сценарии сквозного тестирования. Итак, вам нужно будет протестировать все скомпилированное приложение, используя один из сквозных / JS-инструментов.
Ваш код правильно обрабатывает сообщения Timeout x: просто напишите для этого отдельный тестовый пример.
Может быть, взгляните на github.com/elm-lang/http/blob/master/rate-limit.md