我正在使用karma
和Mocha
为我的客户端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();
});
});
});
});
我在这里做错了吗?谢谢
答案 0 :(得分:3)
似乎有open issue on sinon说它不能与axios一起使用,这似乎就是这种情况。
Axios实际上并没有调用你的假服务器。它似乎试图从字面上请求/cart
,这就是你超时的原因。
该用户使用another lib called nock mentions it here
替换了fakeServer还有其他库允许您模拟请求。
我通常使用supertest npm,Github。
来自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")
结果是一样的。