Javascript 如何将依赖项传递给Vue组件?

Javascript 如何将依赖项传递给Vue组件?,javascript,vue.js,vuejs2,Javascript,Vue.js,Vuejs2,我有一个类,用作使用axios发出AJAX请求的存储库: 导出默认类存储库{ getEncryptedValue(值){ 返回axios.get('http://localhost/api/v1/encrypt') } } 我有一个组件在组件的methods属性中调用这个存储库的方法,如下所示: <template> ... </template> <script> import SomeRepository from '@/classes/SomeR

我有一个类,用作使用axios发出AJAX请求的存储库:

导出默认类存储库{
getEncryptedValue(值){
返回axios.get('http://localhost/api/v1/encrypt')
}
}
我有一个组件在组件的
methods
属性中调用这个存储库的方法,如下所示:

<template>
  ...
</template>

<script>
import SomeRepository from '@/classes/SomeRepository'

export default {
  data () {
    return {
      value: '',
      result: ''
    }
  },
  methods: {
    encrypt () {
      let someRepo = new SomeRepository()

      someRepo.getEncryptedValue(this.value)
        .then(response => {
          this.result = response.data.result
        })
    }
  }
}
</script>
这显然不起作用(老实说,我没想到他们会起作用)。我也试着跟随这篇文章,但我并不喜欢每次我想使用依赖项时都必须创建一个mixin的方法


我还考虑将其作为道具传递,但在传递之前不确定在何处实例化对象。

有很多方法可以模拟函数。我发现最简单的方法是简单地接受依赖项作为函数的参数,并替换要在测试中使用的函数

方法示例 你的榜样 一旦你知道了这个方法,你可以做很多不同的版本,但是要展示一个超级简单的版本

encrypt() {
  this._encrypt(SomeRepository)
}
_encrypt (SomeRepository) {
  let someRepo = new SomeRepository()

  someRepo.getEncryptedValue(this.value)
    .then(response => {
      this.result = response.data.result
    })
}
您将使用模拟依赖项测试_encrypt

你也可以这样做

encrypt (_SomeRepository=SomeRepository) {
  let someRepo = new _SomeRepository()

  someRepo.getEncryptedValue(this.value)
    .then(response => {
      this.result = response.data.result
    })
}
如果您传入模拟版本,它将使用该版本,如果您不传入,它将使用真实版本。
我们的想法是使用这种方法,不管你认为合适与否,但我认为你已经明白了。它非常简单,不需要魔法,也不需要库。

模拟函数的方法很多。我发现最简单的方法是简单地接受依赖项作为函数的参数,并替换要在测试中使用的函数

方法示例 你的榜样 一旦你知道了这个方法,你可以做很多不同的版本,但是要展示一个超级简单的版本

encrypt() {
  this._encrypt(SomeRepository)
}
_encrypt (SomeRepository) {
  let someRepo = new SomeRepository()

  someRepo.getEncryptedValue(this.value)
    .then(response => {
      this.result = response.data.result
    })
}
您将使用模拟依赖项测试_encrypt

你也可以这样做

encrypt (_SomeRepository=SomeRepository) {
  let someRepo = new _SomeRepository()

  someRepo.getEncryptedValue(this.value)
    .then(response => {
      this.result = response.data.result
    })
}
如果您传入模拟版本,它将使用该版本,如果您不传入,它将使用真实版本。
我们的想法是使用这种方法,不管你认为合适与否,但我认为你已经明白了。它非常简单,不需要魔法和库。

您应该使用Vue插件 然后,您可以通过例如
this.$someDeps


对于单元测试,您可以使用Vue测试Utils轻松模拟它

您应该使用Vue插件 然后,您可以通过例如
this.$someDeps

对于单元测试,您可以使用Vue测试Utils轻松模拟它