【问题标题】:How to setup proper scope inside Jasmine spyOn method call?如何在 Jasmine spyOn 方法调用中设置适当的范围?
【发布时间】:2017-09-03 20:54:33
【问题描述】:

我目前正在尝试测试我是否能够在我构建的类中调用某些方法。通过反复试验,我能够让它与班级正确连接,但现在我收到了这个错误:

“错误: : 找不到用于 sayHello() 的对象”

经过研究,我认为这是一个范围问题。我尝试在 spyOn 调用中删除删除 bookTitles,将原型添加到 fakeTitle(及其相应部分),以及在我的主 JS 文件中的类中弄乱方法声明。这些尝试似乎都没有奏效(实际上它实际上有一半时间断开了链接)。为什么 spyOn 方法无法识别 sayHello()?

这是我的代码:

class bookTitle {
    helloSomeone(toGreet) {
        return this.sayHello() + ' ' + toGreet;
    }

    sayHello() {
        return 'Hello';
    }
}

module.exports = {
    bookTitle
}

还有我的 Jasmine 文件:

var bookTitles = require ('./bookTitles.js');

describe('bookTitle', function() {
    it('calls the sayHello() function', function() {
        var fakeTitle = new bookTitles.bookTitle();
        spyOn(bookTitles.fakeTitle, 'sayHello');
        bookTitles.fakeTitle.helloSomeone('world');
        expect(bookTitles.fakeTitle.sayHello).toHaveBeenCalled();
    });
});

还有一个附带问题,如果我说 fakeTitle 对象是 bookTitle 类的一部分,那么为什么我需要在 spyOn 方法及以下方法中声明 bookTitles?我的想法是,通过在所需文件的类中说它是一个新对象,那么之后的任何方法调用都不应该自动假定调用应该去的地方吗?

【问题讨论】:

    标签: javascript jasmine


    【解决方案1】:

    你必须监视你创建的对象:

    describe('bookTitle', function() {
        it('calls the sayHello() function', function() {
            var fakeTitle = new bookTitles.bookTitle();
            spyOn(fakeTitle, 'sayHello');
            fakeTitle.helloSomeone('world');
            expect(fakeTitle.sayHello).toHaveBeenCalled();
        });
    })
    

    【讨论】:

    • 我明白了,我在概念上误解了 spyOn 的功能。这个答案也同时回答了我的附带问题,谢谢你的帮助!
    猜你喜欢
    • 1970-01-01
    • 2020-10-08
    • 2012-01-18
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2019-02-09
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多