js开玩笑的模拟类和静态方法

时间:2018-08-03 13:33:13

标签: javascript unit-testing jestjs

我为类编写了模拟程序,当我测试创建实例时一切正常,但当我测试静态方法时一切正常。如何解决这个问题? 这是我的测试课:

class Order {
    async add(items) {
        const order = new OrderModel({items});
        await order.save();
        //...
    }

    async find(items) {
        const query = OrderModel.find({
            //condition
        });
        //...
    }
}

我的OrderModel模拟:

const mockOrderModel = {
    save: jest.fn(),
    find: jest.fn(),
    exec: jest.fn()
};

jest.mock('../order/order.model', () => {
    return jest.fn().mockImplementation(() => {
        return {
            save: mockOrderModel.save,
            find: mockOrderModel.find,
            exec: mockOrderModel.exec
        };
    });
});

并测试这两种方法:

//WORKS
it('add()', async () => {
    await order.add(['']);

    expect(OrderModel).toHaveBeenCalledTimes(1);
    expect(mockOrderModel.save).toHaveBeenCalledTimes(1);
});

//NOT WORKS
it('find()', async () => {
    await order.find(['']);

    expect(mockOrderModel.find).toHaveBeenCalledTImes(1);
});

OrderModel.find()方法未调用

1 个答案:

答案 0 :(得分:0)

这是因为find上的mockOrderModel被定义为对象的属性,而不是静态方法。因此,基本上,您正在为Order创建一个具有find属性的模拟对象,该属性必须在实例上调用。 Order的静态方法未模拟。为此,您可以尝试:

Order.find = jest.fn()