• [转]详解在vue-test-utils中mock全局对象


    来源:https://www.zhangshengrong.com/p/nDa9eKMyaj/

    --------------------------------------------------------------------------------------------------------------------------------------------

    vue-test-utils   提供了一种 mock 掉   Vue.prototype   的简单方式,不但对测试用例适用,也可以为所有测试设置默认的 mock。

    mocks   加载选项

    mocks   加载选项   是一种将任何属性附加到   Vue.prototype   上的方式。这通常包括:

    • $store , for Vuex
    • $router , for Vue Router
    • $t , for vue-i18n

    以及其他种种。

    vue-i18n   的例子

    我们来看一个 vue-i18n   的例子。虽然可以为每个测试用到   createLocalVue   并安装   vue-i18n ,但那样可能会让事情难以处理并引入一堆样板。首先,组件   <Bilingual>   用到了   vue-i18n :

    <template>
     <div class="hello">
      {{ $t("helloWorld") }}
     </div>
    </template>
    
    <script>
     export default {
      name: "Bilingual"
     }
    </script>
    

    你先在另一个文件中弄好翻译,然后通过 $t   引用,这就是   vue-i18n   的工作方式。在本次测试中,虽然并不会真正关心翻译文件看起来什么样,不过还是看一看这次用到的:

    export default {
     "en": {
      helloWorld: "Hello world!"
     },
     "ja": {
      helloWorld: "こんにちは、世界!"
     }
    }
    

    基于这个 locale,正确的翻译将被渲染出来。我们先不用 mock,尝试在测试中渲染该组件:

    import { shallowMount } from "@vue/test-utils"
    import Bilingual from "@/components/Bilingual.vue"
    
    describe("Bilingual", () => {
     it("renders successfully", () => {
      const wrapper = shallowMount(Bilingual)
     })
    })
    

    通过 yarn test:unit   运行测试将抛出一堆错误堆栈。若仔细端详输出则会发现:

    [Vue warn]: Error in config.errorHandler: "TypeError: _vm.$t is not a function"

    这是因为我们并未安装 vue-i18n ,所以全局的   $t   方法并不存在。我们试试   mocks   加载选项:

    import { shallowMount } from "@vue/test-utils"
    import Bilingual from "@/components/Bilingual.vue"
    
    describe("Bilingual", () => {
     it("renders successfully", () => {
      const wrapper = shallowMount(Bilingual, {
       mocks: {
        $t: (msg) => msg
       }
      })
     })
    })
    

    现在测试通过了! mocks   选项用处多多,而我觉得最最常用的正是开头提到过的那三样。

    (译注:通过这种方式就不能在单元测试中耦合与特定语言相关的内容了,因为翻译功能实际上已失效,也更无法处理可选参数等)

    使用配置设置默认的 mocks

    有时需要一个 mock 的默认值,这样就不用为每个测试用例都设置一遍了。可以用 vue-test-utils   提供的   config   API 来实现。还是   vue-i18n   的例子:

    import VueTestUtils from "@vue/test-utils"
    
    VueTestUtils.config.mocks["mock"] = "Default Mock Value"
    

    这个示例中用到了 Jest,所以我将把默认 mock 描述在 jest.init.js   文件中 -- 该文件会在测试运行前被自动加载。同时我也会导入并应用此前用于示例的翻译对象。

    //jest.init.js
    
    import VueTestUtils from "@vue/test-utils"
    import translations from "./src/translations.js"
    
    const locale = "en"
    
    VueTestUtils.config.mocks["$t"] = (msg) => translations[locale][msg]
    

    现在尽管还是用了一个 mock 过的 $t   函数,但会渲染一个真实的翻译了。再次运行测试,这次移除了   mocks   加载选项并用   console.log   打印了   wrapper.html() 。

    describe("Bilingual", () => {
     it("renders successfully", () => {
      const wrapper = shallowMount(Bilingual)
    
      console.log(wrapper.html())
     })
    })
    

    测试通过,以下结构被渲染出来:

    <div class="hello">
     Hello world!
    </div>
    

    (译注:依然无法应付复杂的翻译)

    总结

    本文论述了:

    • 在测试用例中使用 mocks   以 mock 一个全局对象
    • 用 config.mocks   设置默认的 mock

    以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

    时间: 2018-11-06
  • 相关阅读:
    Flask第31课——include标签
    flask第30篇——宏macro和import标签
    HTML第三课——css盒子
    HTML第二课——css【2】
    HTML第二课——css
    HTML第一课——基础知识普及【2】
    转一篇数据库面试题
    自创建数字证书,安装到浏览器
    【转】Base64算法详解
    【转】二维码生成原理
  • 原文地址:https://www.cnblogs.com/jiemao/p/12777826.html
Copyright © 2020-2023  润新知