javascript - 如何将依赖项传递给 Vue 组件?
问题描述
我有一个类,旨在用作使用 axios 发出 AJAX 请求的存储库:
export default class SomeRepository {
getEncryptedValue (value) {
return 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>
如何SomeRepository
作为依赖项传递?我的目标是我想在我的单元测试中模拟它。
我正在寻找一个简单的解决方案,最好是不涉及第三方库或样板的解决方案。
我也尝试过:
import Vue from 'vue'
import SomeRepository from '@/classes/SomeRepository'
Vue.use(SomeRepository)
// and
Vue.use(new SomeRepository())
这显然行不通(老实说,我没想到他们会这样做)。我也尝试关注这篇文章https://codeburst.io/dependency-injection-with-vue-js-f6b44a0dae6d但我并不喜欢每次我想使用依赖项时都必须创建一个 mixin 的方法。
我也考虑过将它作为道具传递,但在传递它之前不确定在哪里实例化对象。
解决方案
有很多方法可以模拟函数。我发现的最简单的方法是简单地接受依赖项作为函数的参数并替换要在测试中使用的函数。
方法示例
// Function
function func(dependency) {
dependency.use()
}
// In App
func(dependency) // -> runs dependency.use
// In Tests
func(mockDependency) // -> runs mocked dependency.use
你的例子
一旦你知道了这个方法,你就可以做很多不同的版本,但要展示一个超级简单的版本。
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
})
}
如果您传入模拟版本,它将使用它,如果您不这样做,它将使用真实版本。这个想法是使用这种方法,但你认为合适,但我认为你明白了。它超级简单,不需要魔法,也不需要库。
推荐阅读
- c# - 如何将完整的独立 .NetCoreApp 发布为 exe?
- java - 有什么办法可以从 div 的内部 html 中删除 \n 吗?
- excel - 我可以通过使用 vba 代码以某种方式修改 excel 中的数学自动更正列表吗?
- android - Android VideoView 根据每个设备调整大小
- python - OAuth 在 Google OAuth2 中抛出“缺少代码验证器”
- purescript - Text.Smolder.Renderer.String.purs 中的非法字符转义
- javascript - 为什么在 Hawk 中创建授权请求标头时出现错误“内部服务器错误”?
- r - 如何使用 spatstat 中的 Lest() 函数绘制 Ripley 的 L
- python-3.x - 如何绘制图表以显示股票价格的移动平均线
- kubernetes - 如何从“docker-for-desktop”节点获取 IP 地址?