Vue Test Utils (мокко, чай) - как ждать http-запрос - PullRequest
0 голосов
/ 13 июня 2019

Мне нужно написать модульный тест для компонента Single File в Vue JS. Мой проект основан на Vue Cli , и для тестирования я выбрал комбинацию Mocha / Chai.

Мой компонент использует Axios для загрузки некоторого JSON из URL до его монтирования. На данном этапе я не хочу издеваться над этой нагрузкой во время тестирования, я просто хочу, чтобы этот запрос не прошел, а затем отобразить некоторую информацию.

Очень упрощенный пример моего компонента Async.vue:

<template>
  <div>
    <h1>Async Request test</h1>
    <b v-if="finished">Request finished</b>
  </div>
</template>

<script lang="ts">
import { Component, Prop, Vue } from "vue-property-decorator";
import axios from "axios";

@Component
export default class AsyncRequest extends Vue {
finished = false;
beforeMount() {
    axios.get("not/real/url").then((response) => {
      this.finished = true;
    },
    (error) => {
      this.finished = true;
    });
  }
}
</script>`

А это мой тестовый скрипт:

import { expect } from "chai";
import { shallowMount } from "@vue/test-utils";
import Async from "@/components/Async.vue";

describe("Async.vue", () => {
  it("Renders 'Request finished'", (done) => {
    const wrapper = shallowMount(Async, {});
    wrapper.vm.$nextTick(() => {
      expect(wrapper.text()).to.include("test"); // it passes
      expect(wrapper.text()).to.include("finished"); // it fails
      done();
    });
  });
});

Я ожидаю, что мой тест пройдёт. Мне просто нужно протестировать мой компонент после того, как beforeMount закончится. Позвольте мне еще раз подчеркнуть - я не хочу сейчас получать реальные или поддельные данные от axios.get.

1 Ответ

0 голосов
/ 13 июня 2019

Благодаря Стивену Томасу комментарию, я был направлен на правильный путь.

Два условия должны быть выполнены:

  1. Запрос должен быть посмеян (я использовал https://github.com/axios/moxios/).
  2. Должны использоваться Flush-Promises .

См. Улучшенный код тестирования ниже:

import moxios from "moxios";
import { expect } from "chai";
import { shallowMount } from "@vue/test-utils";
import flushPromises from "flush-promises";
import Async from "@/components/Async.vue";

describe("Async.vue", () => {
  it("Renders 'Request finished'", async () => {
    moxios.install();
    moxios.stubRequest(/.*/, {
      status: 200,
      responseText: "hello guy",
    });

    const wrapper = shallowMount(Async, {});
    await flushPromises();

    expect(wrapper.text()).to.include("finished"); // it passes now
  });
});

...