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

触发事件

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