【问题标题】:Jasmine - spy on "new myFunction()" not being calledJasmine - 监视未调用“new myFunction()”
【发布时间】:2018-07-12 19:41:40
【问题描述】:

我有一个模拟模块:

Observable.js

define([], function() {
    const Observable = function(data) {
        console.log('called'); /* <-- this is shown in console */
        this.data = data;
    };
    return Observable;
});

从我的文件 myFuncs.js

中调用
createNewObservable: function(values) {
    return new Observable(values);
},

我正在尝试这样的测试:

describe('createNewObservable', () => {
    it("calls Observable", () => {
        window.Observable = Observable;
        const observableSpy = spyOn(window, 'Observable');
        myFuncs.createNewObservable(123);
        expect(observableSpy).toHaveBeenCalled();
    });
});

spy 没有被调用,导致测试失败

预期的间谍 Observable 已被调用

如上所述,看到控制台日志,所以调用了该函数,我显然是在监视它是错误的。

我如何监视它才能捕获呼叫?

【问题讨论】:

    标签: javascript jasmine


    【解决方案1】:

    对我来说非常有趣的问题。

    它不起作用的原因 - 因为您实际上没有调用间谍。您从模块中调用 real observable 。而且我认为你无法直接实现你想要的。

    但有一个选项 - 您可以修改 createNewObservable 函数以将工厂作为第二个参数。所以,结果会像这里(简化)

    describe('my test', () => {
    
        const Observable = function (data) {
            this.data = data;
        };
    
        function createNewObservable(values, observer = Observable) {
            return new observer(values);
        }
    
        it("calls Observable", () => {
            const spy = jasmine.createSpy();
            createNewObservable(123, spy);
            expect(spy).toHaveBeenCalled();
        });
    
    })
    

    希望这会有所帮助,至少有点

    【讨论】:

    • 嗯 - 有趣的方法,但我真的不想开始修改代码库中使用例如new whatever() - 不过很感谢您的回答
    • 是的,这就是为什么我会感兴趣地等待另一个答案)
    猜你喜欢
    • 2012-08-04
    • 2013-01-09
    • 2014-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多