javascript - Sinon Stub JavaScript 方法链

标签 javascript unit-testing sinon

我正在寻找使用 sinon stub 来测试下面的方法链:

driver.manage().window().setSize()

我发现了一个相关问题,它解释了如何访问链下的一种方法,但这似乎并没有让我访问任何其他方法。

t.context.webdriver = sinon.stub(new WebDriver)
sinon.stub(t.context.webdriver, "manage", () => {
    return {
        window: sinon.stub().returns();
    };
})

返回错误

Error: this._driver.manage(...).window(...).setSize is not a function

如何 stub 多级方法链?

最佳答案

我不确定您要测试什么,但错误是因为您的 stub 返回的对象没有 window() 函数或 设置大小()。链之所以起作用,是因为链的每个部分都返回一些与下一次调用匹配的方法。所以如果你在链的早期填充一些东西,你需要确保你返回的东西有那些方法。也许这涉及传回原始返回,或者您可能伪造整个链条。

这是一个至少不会抛出的例子:

const sinon = require('sinon')

// some fake object that maybe looks like what you have
let driver = {
manage(){ return this},
window() { return this},
setSize() {console.log("size set")}
}

// stubb manage and now you're resposible for the whole chain
sinon.stub(driver, "manage").callsFake(() => {
    console.log("called")
    return {
        window(){
            return { setSize: sinon.stub().returns() }
        }
    };
})

当然,根据您要测试的内容,可能会有很多变化。

关于javascript - Sinon Stub JavaScript 方法链,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51682449/

相关文章:

javascript - 如何在 Chai 中模拟或 stub 'instanceof' |诗农 |摩卡

javascript - QUnit/赛农 : testing a function which checks if cookies are enabled

javascript - 如何使用Mocha、Chai和Sinon检查函数被调用的参数数量?

javascript - 由于某种原因,clearTimeout 不起作用

unit-testing - EasyMock 和 Mockito 的区别

asp.net-mvc - MapMvcAttributeRoutes:在应用程序的启动前初始化阶段不能调用此方法

angularjs - 如何使用已编译元素在单元测试中访问 c​​ontrollerAs 命名空间?

Zend 和 jQuery Mobile 中的 JavaScript

javascript - 如何从 XUL <browser> 中运行的脚本(例如在侧边栏中)中获取当前事件浏览器窗口/选项卡的 URL

javascript - 我正在尝试创建一个带有指针的 substr 方法……有更优雅的解决方案吗?