单元测试 VueJS 和 VueResource 时状态不变
State not changing when unit testing VueJS and VueResource
我正在尝试测试我创建的服务,该服务使用 vue-resource 进行 API 调用。该服务应该进行调用并使用新数据更新组件,但是在我的测试中它没有注册更新的值。我使用与 vue-cli webpack example and have based my auth service off this repo 相同的设置(遗憾的是没有任何测试)
我的服务:
export default {
login(context, creds){
context.$http.post(LOGIN_URL, creds)
.then((response) => {
//do something else here
}, (response) => {
context.error = response.data.error
}
}
}
我的测试:
import Vue from 'vue'
import VueResource from 'vue-resource'
Vue.use(VueResource)
import Auth from 'src/auth'
describe('Auth', () => {
it('should throw an error on unsuccessful login', (done) => {
//intercept the api call and force an invalid response
Vue.http.interceptors.unshift((request, next) => {
next(request.respondWidth({error: 'some error'}, {status: 401}));
});
const vm = new Vue({
data: {
error: ''
}
}).$mount()
Auth.login(vm, {email: 'test@test.com', pass: 'test'} )
//this always fails
expect(vm.error).to.equal('some error')
//ive also tried:
vm.$nextTick(() => {
expect(vm.error).to.equal('some error')
//done()
});
//undo our interceptor
Vue.http.interceptors.shift()
}
}
当我 运行 测试失败时,因为它期望 '' 等于 'some error'.
我怀疑 vue-resource 正在使用 promises。
阅读了一些 Vue.js 测试后,我找到了答案。我没有使用 vm.$nextTick,而是执行了以下操作:
setTimeout(function(){
expect(vm.error).to.equal('something')
done()
}, 0)
我正在尝试测试我创建的服务,该服务使用 vue-resource 进行 API 调用。该服务应该进行调用并使用新数据更新组件,但是在我的测试中它没有注册更新的值。我使用与 vue-cli webpack example and have based my auth service off this repo 相同的设置(遗憾的是没有任何测试)
我的服务:
export default {
login(context, creds){
context.$http.post(LOGIN_URL, creds)
.then((response) => {
//do something else here
}, (response) => {
context.error = response.data.error
}
}
}
我的测试:
import Vue from 'vue'
import VueResource from 'vue-resource'
Vue.use(VueResource)
import Auth from 'src/auth'
describe('Auth', () => {
it('should throw an error on unsuccessful login', (done) => {
//intercept the api call and force an invalid response
Vue.http.interceptors.unshift((request, next) => {
next(request.respondWidth({error: 'some error'}, {status: 401}));
});
const vm = new Vue({
data: {
error: ''
}
}).$mount()
Auth.login(vm, {email: 'test@test.com', pass: 'test'} )
//this always fails
expect(vm.error).to.equal('some error')
//ive also tried:
vm.$nextTick(() => {
expect(vm.error).to.equal('some error')
//done()
});
//undo our interceptor
Vue.http.interceptors.shift()
}
}
当我 运行 测试失败时,因为它期望 '' 等于 'some error'.
我怀疑 vue-resource 正在使用 promises。
阅读了一些 Vue.js 测试后,我找到了答案。我没有使用 vm.$nextTick,而是执行了以下操作:
setTimeout(function(){
expect(vm.error).to.equal('something')
done()
}, 0)