javascript - 使用Sinon.JS和Rewire时是否可以设置 `this`的值?

标签 javascript unit-testing sinon

背景

如果我有以下模块:

this_module: {

    foo: {};

    set_this_foo: function () {

        this.foo.boo = 'something';
        return this.foo;
    }
}

并使用Rewire导入私有(private)函数,然后使用 Sinon.js 对该函数进行单元测试:

var set_this_foo = app.__get__('this_module.set_this_foo');
var spy = sinon.spy(set_this_foo);

spy();

expect(spy).to.have.returned({boo: 'something'});

我收到错误消息:

TypeError: Cannot set property 'boo' of undefined

因为 this 最终具有全局对象的值。我可以通过在运行测试之前定义一个名为 foo 的全局变量来解决此问题,但不希望污染全局命名空间。

问题

是否有一种(优雅的)方法来定义与 spy() 相关的 this 的值?

最佳答案

我会做一些不同的事情:

var myModule = app.__get__('this_module');
var spy      = sinon.spy(myModule, 'set_this_foo');

myModule.set_this_foo();

expect(spy).to.have.returned({ boo : 'something' });

由于您还可以使用原始方法名称(除了 spy 之外)来引用 spy ,因此调用该方法将确保在正确的上下文中调用它。

关于javascript - 使用Sinon.JS和Rewire时是否可以设置 `this`的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35719172/

相关文章:

ruby-on-rails - RSpec 测试所有模型是否respond_to 属性

javascript - 在 Label 悬停时显示工具提示?

javascript - 在 CouchDB Map 函数中发出日期时 - 日期对象上调用了什么?

javascript - 如何从给定的外部url获取数据 session id和所有内容,而不是从 Angular 6中的我的应用程序(路由)获取

php - 单元测试 Laravel 5.1 中的用户身份验证

java.lang.NoSuchMethodError : No interface method onTransitionToIdle()V 错误

javascript - QUnit、Sinon.js 和 Backbone 单元测试受挫 : sinon spy appears to fail to detect Backbone Model event callbacks

unit-testing - 使用Sinon、Mocha、Enzyme 和 React 模拟窗口

javascript - 如何在谷歌地图上动态绘制多段线

javascript - 使用 Sinon.JS 打桩 async.waterfall