返回介绍

测试键盘、鼠标等其它 DOM 事件

发布于 2023-10-15 16:32:58 字数 4966 浏览 0 评论 0 收藏 0

触发事件

Wrapper 封装了一个 trigger 方法。它可以用来触发 DOM 事件。

const wrapper = attach(myButton);

wrapper.trigger('click');

你应该注意到了,find 方法也会返回一个 Wrapper。假设 myComponent 包含一个按钮,下面的代码会点击这个按钮。

const wrapper = attach(myComponent);

wrapper.find('button').trigger('click');

选项

trigger 方法接受一个可选的 options 对象。这个 options 对象里的属性会被添加到事件中。

注意 target 对象不能被添加到 options 对象中。

const wrapper = attach(myButton);

wrapper.trigger('click', {button: 0});

鼠标点击示例

待测试的组件

import san from 'san';

export default san.defineComponent({
    name: 'YesNoComponent',
    callYes() {
        this.callMe('yes');
    },
    callNo() {
        this.callMe('no');
    },
    template: `<div>
        <button class="yes" on-click="callYes">Yes</button>
        <button class="no" on-click="callNo">No</button>
    </div>`
})

测试

import yesNoComponent from './yesNoComponent';
import {attach} from 'san-test-utils';
import sinon from 'sinon';

describe('Click event', () => {
    it('Click on yes button calls our method with argument "yes"', () => {
        const spy = sinon.spy()
        const wrapper = attach(yesNoComponent, {
            methods: {
                callMe: spy
            }
        });
        wrapper.find('button.yes').trigger('click');

        spy.should.have.been.calledWith('yes');
    });
});

键盘示例

待测试的组件

这个组件允许使用不同的按键将数量递增/递减。

import san from 'san';

const KEY_DOWN = 40;
const KEY_UP = 38;
const ESCAPE = 27;

export default san.defineComponent({
    initData() {
        return {
            quantity: 0
        };
    },
    inited() {
        this.watch('quantity', val => {
            this.fire('input', val);
        });
    },
    increment() {
        let quantity = this.data.get('quantity');
        this.data.set('quantity', ++quantity);
    },
    decrement() {
        let quantity = this.data.get('quantity');
        this.data.set('quantity', --quantity);
    },
    clear() {
        this.data.set('quantity', 0);
    },
    onKeydown(e) {
        if (e.keyCode === ESCAPE) {
            this.clear();
        }
        if (e.keyCode === KEY_DOWN) {
            this.decrement();
        }
        if (e.keyCode === KEY_UP) {
            this.increment();
        }
        if (e.key === 'a') {
            this.data.set('quantity', 13);
        }
    },
    template: '<input type="text" on-keydown="onKeydown" value="{=quantity=}" />'
});

测试用例

import quantityComponent from './quantityComponent';
import {attach} from 'san-test-utils';

describe('Key event tests', () => {
    it('Quantity is zero by default', () => {
        const wrapper = attach(quantity);
        expect(wrapper.vm.data.get('quantity')).toBe(0);
    });

    it('Up arrow key increments quantity by 1', () => {
        const wrapper = attach(quantity);
        wrapper.trigger('keydown-up');
        expect(wrapper.vm.data.get('quantity')).toBe(1);
    });

    it('Down arrow key decrements quantity by 1', () => {
        const wrapper = attach(quantity);
        wrapper.vm.data.set('quantity', 5);
        wrapper.trigger('keydown-down');
        expect(wrapper.vm.data.get('quantity')).toBe(4);
    });

    it('Escape sets quantity to 0', () => {
        const wrapper = attach(quantity);
        wrapper.vm.data.set('quantity', 5);
        wrapper.trigger('keydown-esc');
        expect(wrapper.vm.data.get('quantity')).toBe(0);
    });

    it('Magic character "a" sets quantity to 13', () => {
        const wrapper = attach(quantity);
        wrapper.trigger('keydown', {
            key: 'a'
        });
        expect(wrapper.vm.data.get('quantity')).toBe(13);
    });
})

按键名 keydown-up 会被翻译成一个 keyCode。我们目前支持的按键名有:

key namekey code
enter13
esc27
tab9
space32
delete46
backspace8
insert45
up38
down40
left37
right39
end35
home36
pageup33
pagedown34

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文