【发布时间】:2020-06-09 14:43:12
【问题描述】:
让我们假设一个基本的 Bootstrap 驱动的 HTML 表单作为自定义 Vue 组件 MyForm.vue 的一部分
<template>
<form>
<div class="form-group">
<label for="email">Email address</label>
<input type="email" class="form-control" id="email">
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
</template>
用于测试模板是否成功呈现的单元测试非常简单
describe('MyForm', () => {
let wrapper;
beforeEach(...);
it('Should be rendered', () => {
let field = wrapper.find('#email');
expect(field.element.value).toEqual('');
});
});
这行有效field.element.value 有效,因为field.element 是具有value 属性的本机类型HtmlInputElement。
如果我想访问复杂组件的属性,比如说b-form-input,Bootstrap-Vue 的默认输入元素怎么办? b-form-input 是 BFormInput 类型的怎么处理呢?只需将HtmlElement 转换为BFormInput?
<template>
<b-form>
<b-form-group label="Email">
<b-form-input type="email" id="email"></b-form-input>
</b-form-group>
<b-button type="submit" variant="primary">Submit</button>
</b-form>
</template>
如何测试非原生组件?特别是类型安全意味着 TypeScript。有什么想法吗?
编辑 03/01/2020
根据muka.gergely 的回答,我找到了this 文章。 shallowMount 默认情况下会存根所有子组件,这也阻止了事件处理。此外,shallowMount 允许手动 unstub 组件,在我的情况下,可以 unstub b-form 和 b-button 以提交事件测试。
const stubs = { // Originally intended to provide custom stubs, here used to unstub components
BButton,
BForm,
};
wrapper = shallowMount<MyComponent>(MyComponent, {stubs});
这会影响这些组件被渲染而不是存根。像b-form-input 这样的所有剩余组件仍然会自动存根。
【问题讨论】:
标签: javascript typescript unit-testing vue.js bootstrap-4