заглушить функцию с обратным вызовом, не возвращать обещание - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть служба, которая вызывает функцию, я пишу тест для этой службы, и мне нужно заблокировать функцию внутри этой службы, эта функция имеет обратный вызов вместо возврата обещания.когда я делаю заглушку для этого, я даю фиктивный возврат, но он зависает, так как сервис ожидает обратного вызова, вот мой код для теста

describe('Testing Token Service', () => {
let _stub =null;
beforeEach(async()=>{
    _stub = sinon.stub(tModel.prototype, "save")
})
afterEach(async()=>{
  if(_stub){
    _stub.restore()
  }
})

it('testing function saveToken_mongo() ', (done) => {
    _stub.returns(Promise.resolve( {'status' : 'true'} ))
    token_service.saveToken_mongo({},function(err, data){
        console.log(err, data)
        done();
    })
    // done()
});   });

, а вот сервисная функция, для которой я пишу тест

Service.prototype.saveToken_mongo = function(token, callback){
var _token = new tModel( token ) ;
_token.save(function(err, data){
    if(err){
        callback(err, null);
        return ;
    }
    else{
        callback(null, {'status':true})
        return ;
    }  
}) }

Мне нужно сделать обратный возврат из этой функции с помощью заглушки.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

stub.returns используется для обычной функции, а не для обратного вызова.Поскольку save является функцией обратного вызова, мы можем использовать yields.

_stub.yields(null, {'status' : 'true'});

Первый аргумент предназначен для значения ошибки, а второй - для данных.

Для справки:

https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-

0 голосов
/ 16 февраля 2019

После исследования я пришел к выводу, что есть 2 решения этой проблемы.

1) в соответствии с deerawan мы можем использовать выходы для замены обратного вызова функции, как это

_stub.yields(null, {'status' : 'true'});

для более подробной информации https://sinonjs.org/releases/v7.1.1/stubs/#stubyieldsarg1-arg2-

2) используйте bluebird для обещания всех методов, которые изменят ответ всех методов от обратного вызова, чтобы обещать, тогда вы можете использовать Promise.returns, вот код

var Model = conn.model( name , ModelSchema);
var Promise = require('bluebird');
Promise.promisifyAll(Model);
Promise.promisifyAll(Model.prototype);
module.exports = Model;

Теперь вы можете использовать тест следующим образом

let _stub = null;
var tModel = require('./../app/models/tokens') ;
beforeEach(async()=>{
    _stub = sinon.stub(tModel.prototype, "save")
})
afterEach(async()=>{
  if(_stub){
    _stub.restore()
  }
})
it('returns a Promise' ,async function(){
    _stub.returns(Promise.resolve( {'status' : 'true & false'} ));
    expect(token_service.saveToken_mongo({})).to.be.a("Promise")   
})
0 голосов
/ 14 февраля 2019

Это немного сложно, ваш обратный вызов - это параметр saveToken_mongo,

не проверял его, но попытался:

 _stub.returns(function(err, data){callback(null, {'status':true}) });

, дайте мне знать, если вы получили ошибку для обратного вызова,вы можете попробовать использовать this.callback вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...