使用异步ajax调用的Sinon / Mocha测试没有返回promise

时间:2017-01-06 23:30:21

标签: javascript unit-testing mocha sinon

我正在使用karmaMocha为我的客户端api使用Sino编写一些测试。但是我一直坚持要获得异步过程。

import api from '../../../src/api';
import stubData from '../data';
import axios from 'axios';

/* eslint-disable prefer-arrow-callback,func-names */
describe('API test', function () {
  before(function () {
    this.server = sinon.fakeServer.create();
  });
  after(function () {
     this.server.restore();
  });

it('Should return cart with provided token', function (done) {
  this.server.respondWith("GET", "/cart",
        [200, { "Content-Type": "application/json" },
         '[{ "id": 12, "comment": "Hey there" }]']);

 axios.get('/cart')
  .then(function (response) {
    console.log(response);
    done();
  })
  .catch(function (error) {
    console.log(error);
    done();
  });
  this.server.respond();
});

 });

出于某种原因,我总是从Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.获得Mocha。在then未执行之后,似乎axios.get()似乎也未调用done

我确实按照Mocha文件

中的建议行事
describe('User', function() {
  describe('#save()', function() {
    it('should save without error', function(done) {
      var user = new User('Luna');
      user.save(function(err) {
        if (err) done(err);
        else done();
      });
    });
  });
});

我在这里做错了吗?谢谢

3 个答案:

答案 0 :(得分:3)

似乎有open issue on sinon说它不能与axios一起使用,这似乎就是这种情况。

Axios实际上并没有调用你的假服务器。它似乎试图从字面上请求/cart,这就是你超时的原因。

该用户使用another lib called nock mentions it here

替换了fakeServer

还有其他库允许您模拟请求。

我通常使用supertest npmGithub

来自Github README的示例

var request = require('supertest');
var express = require('express');

var app = express();

app.get('/user', function(req, res) {
  res.status(200).json({ name: 'tobi' });
});

request(app)
  .get('/user')
  .expect('Content-Type', /json/)
  .expect('Content-Length', '15')
  .expect(200)
  .end(function(err, res) {
    if (err) throw err;
  });

答案 1 :(得分:0)

看起来sinon存根仅适用于axios Request方法别名。 也就是说,如果您通过传递配置来使用axios

axios(someConfig)

上述方法似乎无效。

但是使用方法别名,它似乎可以工作。

axios.get(url, params, config)
axios.post(url, data, config)

当我们这样做

sandbox.stub(axios, "get")

我认为它是在axios中对方法get进行存根处理,但在第一种情况下,不会调用get/post/anyother方法,并且存根处理不起作用。我可能在这方面错了。但这反正对我有用。

答案 2 :(得分:0)

@bring2dip 建议的答案是正确的,但如果您除了使用之外别无选择

axios(config)

然后你可以使用

axios.request(config)

在 test.ts 中你可以使用

sandbox.stub(axios, "request")

结果是一样的。