【问题标题】:Chai 'expect' doesn't execute inside a callbackChai 'expect' 不在回调中执行
【发布时间】:2016-10-16 06:35:26
【问题描述】:

我正在为从某个 REST API 获取信息的函数编写单元测试。我正在使用ramda Future 输入(source)
以下测试很奇怪:

  it('should return Maybe of Nothing', done => {

    let response = {
      status: 200,
      json: () => {
        return {
          results: []
        }
      }
    }

    let fakeFetch = {
      fetch: () => {
        return new Promise((resolve, reject) => {
          resolve(response)
        })
      }
    }

    //                 String -> Future Error Maybe
    let result = Utils.fetchGiantBomb(faker.random.word(), fakeFetch.fetch); 

    result.fork(err => {
      assert.fail(err, 'expected to return Maybe of Nothing'); 
      done();
    }, data => {
      expect(Maybe.isJust(data)).to.be.true;
      done();
    })

  })

data 应该是 Maybe.Nothing 类型。如果我期望Maybe.isNothing 测试通过,但我想看看测试失败时会发生什么,所以我将它设置为Maybe.isJust,它返回false。看了一会儿之后,我注意到当 expect 失败时,它会跳转到错误处理(err 回调),然后停止执行任何断言(这会导致 2000 毫秒超时)。

Future 来源中,我看到当成功回调失败时,它会执行失败回调。如何完成此测试以显示数据不是我所期望的?

【问题讨论】:

    标签: javascript node.js unit-testing ramda.js


    【解决方案1】:

    我认为问题在于,当您的 REST 调用失败时,done() 永远不会被调用。

    不确定expect失败时是否有.catch方法,但可以尝试添加

    .catch(done);
    

    在期望函数的末尾。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      当前调用future.fork(errorHandler, successHandler) 将确保successHandler 中抛出的任何异常都将传播到errorHandler

      解决这个问题的一种方法(尽管可能不理想,因为它没有记录)是调用future._fork(errorHandler, successHandler) 而不是future.fork,在successHandler 中抛出的错误将不会被捕获。

      另外,许多测试框架支持将错误传递给done 回调,例如:

      result.fork(err => {
        done('Expected to return Maybe of Nothing: ' + err);
      }, data => {
        expect(Maybe.isJust(data)).to.be.true;
        done();
      })
      

      【讨论】:

        【解决方案3】:

        我认为 Ramda 不应该在那里捕获异常。但我不知道他们想做什么。

        看起来您正在使用 Mocha。最好先将你的 Future 转换为 Promise,然后再观察 Promise。即:

        const futureToPromise = future => {
          return new Promise((resolve, reject) => future.fork(reject, resolve))
        }
        
        it('should return Maybe of Nothing', () => {
        
          let response = {
            status: 200,
            json: () => {
              return {
                results: []
              }
            }
          }
        
          let fakeFetch = {
            fetch: () => {
              return new Promise((resolve, reject) => {
                resolve(response)
              })
            }
           }
        
          // String -> Future Error Maybe
          let result = Utils.fetchGiantBomb(faker.random.word(), fakeFetch.fetch); 
          // return it because Mocha can handle this
          return futureToPromise(result).then(data => {
            expect(Maybe.isJust(data)).to.be.true;
          }, () => {
            // fail
            assert.fail(err, 'expected to return Maybe of Nothing'); 
          })
        })
        

        【讨论】:

          猜你喜欢
          • 2019-05-27
          • 1970-01-01
          • 1970-01-01
          • 2020-08-20
          • 1970-01-01
          • 2014-02-19
          • 1970-01-01
          • 2012-11-03
          • 1970-01-01
          相关资源
          最近更新 更多