Я пытаюсь протестировать функцию отладки в приложении 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))
Кажется, что различные способы реализации debouncing не решат проблему, поскольку все они полагаютсяна командные сообщения.