【问题标题】:Sinon spy with a Promise not being called未调用Promise的诗乃间谍
【发布时间】:2015-08-29 19:49:23
【问题描述】:

这段代码的测试(如下)失败:

module.exports = function(User, jwt) {
  'use strict';

  return function(req, res) {
    User.create(req.body)
    .then(function(id) {
      var token = jwt.sign({id: id}); 
      res.json({token: token});
    });
  };
};

这是测试:

'use strict';
var chai = require('chai');
var sinon = require('sinon');
require('sinon-as-promised');

chai.should();
chai.use(require('sinon-chai'));

describe('routes/signup', function() {

  var User;
  var request;
  var response;
  var jwt;
  var signup;

  beforeEach(function() {
    User = {create: sinon.stub()};
    request = {body: 'body'};
    response = {json: sinon.spy()};
    jwt = {sign: sinon.stub().withArgs({id:'id'}).returns('token')};
    signup = require('../../../routes/signup')(User, jwt);
  });

  it('returns token when resolving', function() {
    User.create.resolves('id');
    signup(request, response);
    return response.json.should.have.been.calledWith({token: 'token'});
  });
});

如果我询问 response.json 方法,它似乎从未被调用过。 response.args 是一个空数组。

我猜我遗漏了一些关于测试承诺的基本内容。救命!

【问题讨论】:

    标签: javascript node.js promise sinon chai


    【解决方案1】:

    记住,promise 是异步的,所以你需要等到 promise 解决,然后调用 then 方法来做你的断言。 fr0609 的回答会给你一个误报,因为它会在 then 块被调用之前返回。

    试试这个:

    it('returns token when resolving', function(done) {
    
      User.create.resolves('id');
    
      signup(request, response)
        .then(function() {
          response.json.should.have.been.calledWith({token: 'token'});
          done();
        })
        .catch(done);
    });
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-18
    • 2022-07-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 2013-11-21
    • 2019-07-07
    相关资源
    最近更新 更多