ОК, моя настройка выглядит следующим образом: Использование узла 6.2, es6-promisify, sinon, sinon-as-обещано и babel для передачи поддержки импорта/экспорта es6.sinon stub с es6-promisified object
Мой код тестируемой выглядит примерно так:
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, который кажется довольно хромым. Например .:
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();
}
});
И поэтому вопрос, если это не совсем очевидно, это почему мой исходный код не работает? И есть ли способ сделать работу с заглушкой без предварительного изложения первоначального обновления каждый раз (например, как другие люди получают такую работу)?
EDIT:
Текущий код выглядит следующим образом:
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;
}
}
The 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],
....
EDIT2:
И FWIW, Вавилонская сгенерированных код производит это:
let get = exports.get = (0, _es6Promisify2.default)(client.get, { thisArg: client, multiArgs: true });
EDIT3:
Ok супер странно. Я изменил мой источник, чтобы сделать это вместо того, чтобы:
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;
}
}
'get()' не экспортируется, поэтому 'module_client.get()' не определен в вашем тестовом коде. Но даже если он был экспортирован, все еще есть проблемы, вызванные ES6 (по крайней мере, я думаю). Я посмотрю, смогу ли я писать, это ответ. – robertklep
, если вы имеете в виду «get», не экспортируется во втором примере, вы правы, у меня есть ошибка. я имел в виду, что исходный файл restify.client экспортируется как module_client. И я обманываю это. Что работает. – Kevin
О, извините, конечно! Мой ответ все равно должен применяться к первому случаю, второй случай работает вокруг него, пообещав во время выполнения, а не во время импорта. – robertklep