【问题标题】:JavaScript testing promiseJavaScript 测试承诺
【发布时间】:2018-02-07 19:58:29
【问题描述】:

我正在尝试测试一个接收这样的承诺的函数

{
state: 'fulfilled'
value:[Array]
}

function register (foo) {
    return new Promise((resolve,reject)=>{
        query = "INSERT IGNORE INTO....";
        connection.query(query, [foo.value.from, foo.value.id], (err, res, fields) => {
        if(err){
            return undefined //this will change
        }
        return foo
        })
    })
}

问题是我回来了,不拒绝也不解决。所以当我测试时..

    it('insertion error', function () {
        var res = 'error'
        connection = {
            query: (query, input, cb) =>{
                return cb(res, null, null)
            }
        }
        let database = proxyquire('path/to',{
            './connection': connection
        })

        var input = 
        {
            value: {

        id: 'bar',
        data: [],
        from: 'foo'
        }}  


        return database.register(input)
        .then( (result) => {
            expect(result).to.be.undefined
        })
        .catch( (err) => {
            console.log(err)
            err = new Error (`Test fail: ${err}`)
            throw err;
        })
    })

这个功能很好用,我很确定。 我确定的另一件事是 THEN/CATCH 条件永远不会出现。我知道如果我更换退货以解决它会出现,但我需要被退回。

我应该修改什么,或者我应该如何测试它。

【问题讨论】:

  • 没有。修好它。未解决或拒绝的承诺被破坏。功能不好用。
  • 为什么你认为你“需要它被退回”?
  • 该功能运行良好,正如我所说,它正在收到一个承诺。当您收到一个承诺,并且您没有解决或拒绝它时,只是返回一些东西,它将把那个“东西”替换到值字段中
  • @JulianMendez 好吧,不,这不是承诺的工作方式。 new Promise 执行器回调的返回值被忽略,当然你不会从那个返回值但是你试图从 connection.query 回调返回这是不可能的。
  • @JulianMendez 也许您将此与 then 回调混淆了,您可以从中 return 就好了?

标签: javascript node.js unit-testing


【解决方案1】:

这是一个如何做出承诺的基本示例,在此示例中,您可以在 register() 函数中发送 true 或 false。

function register ( foo ) {
   return new Promise( (resolve, reject) =>{
         if(foo){
            resolve('Done');
         }else{
            reject('Error')
         } 
   } )
}


register(false).then( result=>{
   document.write('promisse success... ', result);
} ).catch( error => {
   document.write('promisse error... ', error);
} )

【讨论】:

  • 我不明白这是如何回答这个问题的。 OP知道如何使用resolvereject,他只是不想使用它们。
  • 正如@Bergi 所说,我知道如何使用承诺,“我知道如果我将return 替换为resolve,它会显示出来,但我需要返回。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 2016-05-01
  • 2016-07-23
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多