带有es6承诺对象的sinon存根

凯文

好的,我的设置如下:使用节点6.2,es6-promisify,sinon,sinon-promised和babel转换对es6导入/导出的支持。

我的测试代码看起来像这样:

const client = restify.createJsonClient({
    url: 'http://www.example.com'
});
export let get = promisify(client.get, {thisArg: client, multiArgs: true});

export default function* () {
    yield get('/some/path');
}

然后在我的测试文件中,我将得到以下内容:

import * as m from mymodule;
it('should fail', function(done) {
    let stub = sinon.stub(m, 'get').rejects('i failed');
    client.get('/endpoint/that/leads/to/mymodule/call', function(err, req, res, data) {
        stub.called.should.be.eql(true); // assertion fails!!
        done();
    }
});

我也尝试过将原始的client.get调用存根,但这也不起作用。我要做的唯一一件事就是在每次调用时即时进行通知,并将原始的client.get存根,这似乎很la脚。例如:

export const client = restify.createJsonClient({
    url: 'http://www.example.com'
});
function get() {
    return promisify(client.get, {thisArg: client, multiArgs: true});
}

export default function* () {
    yield get('/some/path');
}

和测试代码这样做:

import {module_client} from mymodule;
it('should fail', function(done) {
    let stub = sinon.stub(module_client, 'get').yields('i failed');
    client.get('/endpoint/that/leads/to/mymodule/call', function(err, req, res, data) {
        stub.called.should.be.eql(true); // assertion succeeds
        done();
    }
});

因此,问题(如果不是很明显的话)为什么我的原始代码不起作用?有没有一种方法可以使存根工作而不会每次都要求原始的重新调整(例如,其他人如何使这种事情工作)?

编辑:

当前代码如下:

const client = restify.createJsonClient({
    url: 'http://www.example.com'
});

export let get = promisify(client.get, {thisArg: client, multiArgs: true});

export default function*() {
    try {
        console.log(exports.get); // <= a large sinon stub object, I'll post that below
        yield exports.get(); // <= throws here, "exports.get is not a function"
    }
    catch(ex) {
        log.error('got an error', ex);
        throw ex;
    }
}

console.log打印以下内容:

{ [Function: proxy]
  isSinonProxy: true,
  reset: [Function],
  invoke: [Function: invoke],
  named: [Function: named],
  getCall: [Function: getCall],
  getCalls: [Function],
  calledBefore: [Function: calledBefore],
  calledAfter: [Function: calledAfter],
  withArgs: [Function],
  matches: [Function],
  printf: [Function],
  calledOn: [Function],
  alwaysCalledOn: [Function],
  calledWith: [Function],
  calledWithMatch: [Function],
  alwaysCalledWith: [Function],
  ....

编辑2:

FWIW,babel生成的代码正在生成此代码:

let get = exports.get = (0, _es6Promisify2.default)(client.get, { thisArg: client, multiArgs: true });

编辑3:

好的,很奇怪。我更改了源来执行此操作:

const client = restify.createJsonClient({
    url: 'http://www.example.com'
});

export let get = promisify(client.get, {thisArg: client, multiArgs: true});

export default function*() {
    try {
        let thePromise = exports.get(); // e.g. call exports.get on separate line from the yield
        yield thePromise; // and the throw now says 'undefined is not a function'. I should note that in both cases, the stack trace shows the error on node_modules/co/index.js at line 65.
    }
    catch(ex) {
        log.error('got an error', ex);
        throw ex;
    }
}
罗伯特克莱普

问题最终与ES6导入/导出的工作方式有关,尤其是与它们如何使您的代码看起来更好,但又防止了容易的间谍活动/存根有关。

以这个示例模块为例:

// my-module.js
function someFunction() {
  console.log('original');
};

export let get = someFunction;

export default function() {
  get();
};

该代码的测试用例可能如下所示:

import * as sinon from 'sinon';
import * as should from 'should';
import setup, * as myModule from './my-module';

it('should call get()', () => {
  let stub = sinon.stub(myModule, 'get');
  setup();
  stub.called.should.eql(true);
});

您会看到原始文件get()被调用,而不是存根调用。这是因为在模块中,get是本地(相对于模块)引用。Sinon在导出的对象中添加了对同一功能的另一个引用。

为了使这项工作有效,而不是在模块中使用本地引用,您需要在导出的对象中使用一个本地引用:

export default function() {
  exports.get();
};

a,这使代码更丑陋。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有es6承诺对象的sinon存根

来自分类Dev

在NodeJS中使用Mocha和Sinon存根ES6类方法

来自分类Dev

在NodeJS中使用Mocha和Sinon存根ES6类方法

来自分类Dev

对 ES6 解构的承诺?

来自分类Dev

是否有setTimeout版本返回ES6承诺?

来自分类Dev

我只是没有得到ES6的“承诺”

来自分类Dev

将具有 ES6 承诺的函数转换为没有 ES6 承诺的函数

来自分类Dev

存根 es6 类函数依赖

来自分类Dev

将带有预定义道具的对象传递给类构造函数es6

来自分类Dev

ES5与ES6的承诺

来自分类Dev

带有 sinon 和 proxyquire 的存根依赖函数不打印存根结果

来自分类Dev

扩展ES6中的承诺

来自分类Dev

摩卡中的ES6承诺

来自分类Dev

承诺es6和超级代理

来自分类Dev

ES6承诺执行顺序

来自分类Dev

ES6类承诺链-访问'this'

来自分类Dev

ES6承诺与阶级冲突

来自分类Dev

es6承诺吞下类型错误

来自分类Dev

处理承诺中的错误 - Es6

来自分类Dev

如何使用带有反引号的 ES6 模板文字语法来显示“结果”对象的失败数组的每个条目

来自分类Dev

使用带有ES6的mixins的ReactJS Reflux

来自分类Dev

带有ES6 Promise的jQuery ajax

来自分类Dev

带有ES6类的AngularJS 1.4,为空

来自分类Dev

带有箭头功能es6的setTimeout ReactJS

来自分类Dev

带有ES6 Promise的递归树遍历

来自分类Dev

带有ES6类的AngularJS 1.4,为空

来自分类Dev

带有Web Pack的Angular 2以及ES6

来自分类Dev

es6声明带有括号的函数

来自分类Dev

reactjs中带有es6映射的意外令牌