【问题标题】:Vue unit testing - mocking imported services when using vue-test-utils mountVue 单元测试 - 使用 vue-test-utils mount 时模拟导入的服务
【发布时间】:2018-03-15 04:38:01
【问题描述】:

我正在使用 vue-test-utils 中的 mount(),有一个组件可以导入应该在单元测试中模拟的服务。

我看到 mount() 有一个 mocks 选项,但试图将guides, common-tips, mocking injections 给出的示例外推到注入服务的场景让我望而却步。

mount(Component, {
  mocks: {
    ...?
  }
})

组件只是简单的导入服务,就是普通的 JS

import DataService from '../services/data.service'

我可以使用inject-loader 让它工作,这里有详细介绍Testing With Mocks

有效的代码

const MyComponentInjector = require('!!vue-loader?inject!./MyComponent.vue')
const mockedServices = {
  '../services/data.service': {
    checkAll: () => { return Promise.resolve() }
  },
}
const MyComponentWithMocks = MyComponentInjector(mockedServices)

const wrapper = mount(MyComponentWithMocks, { store: mockStore, router })

mount(MyComponent, { mocks: ... }) 的语法是什么?

既然 mount() 有一个 mocks 选项,难道不能以某种形式将 mockedServices 传递给它吗?

【问题讨论】:

    标签: unit-testing vuejs2


    【解决方案1】:

    mocks 指的是 Vue 实例。您正在尝试模拟文件依赖项,这是一个不同的问题。正如您所说,一种解决方案是注入加载器。另一个是 babel-plugin-rewire。

    让我澄清一下mocks 选项的作用。

    mocks 为 Vue 实例添加属性。

    如果您有一个注入$route 的应用程序,您可能有一个组件试图访问它:this.$route.path

    ...
      methods: {
        logPath() {
          console.log(this.$route.path)
        }
      } 
    ... 
    

    如果你在不安装Vue路由器的情况下尝试mount这个组件,会抛出错误。为了解决这个问题,您可以使用 mocks 挂载选项将模拟 $route 对象注入 Vue 实例:

    const $route = { path: 'some/mock/value' }
    mount(Component, {
      mocks: {
        $route
      }
    })
    

    【讨论】:

    • 干杯 Edd,我从 add-mocks.js 中看到,模拟选项只是为实例添加属性。来自 Angular,其中注入的依赖项 do 最终作为实例属性,我对 Vue 也有同样的想法。纯粹作为一个实验,我使用created () { this.dataService = DataService } 将我的服务设置为实例属性。然后我可以在没有注入器的情况下模拟它,但不能在 mount 的 mocks 选项中,我必须在 mount 后在 wrapper.vm 上替换它。我猜从 add-mocks 运行后注入器正在运行。
    • 是的,模拟在我们创建实例之前运行
    • 进一步说明,记录在案的使用注入器模拟的方式不太正确(多个步骤,注入键是路径字符串而不是依赖项名称)。将vue-inject 添加到项目中可以更轻松地模拟服务。
    • 所以,要明确一点:vue-test-utils 是否支持开箱即用的模拟注入?看起来只有长格式适用于注入加载程序,对吗?
    猜你喜欢
    • 2018-04-29
    • 2019-10-24
    • 2020-01-02
    • 2021-09-11
    • 2021-05-07
    • 2019-08-07
    • 2018-10-30
    • 2018-05-04
    • 2019-07-16
    相关资源
    最近更新 更多