柴'期待'不会在回调中执行

时间:2016-10-16 06:35:26

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

我正在为我的函数编写单元测试,从一些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回调),然后停止执行任何断言(导致2000ms超时)

Future源代码中,我看到当成功回调失败时,它会执行失败回调。如何完成此测试以显示数据不符合我的预期?

3 个答案:

答案 0 :(得分:0)

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

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

.catch(done);

在期望功能结束时。

希望有所帮助。

答案 1 :(得分:0)

调用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();
})

答案 2 :(得分:0)

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

看起来你正在使用摩卡。将你的未来转换为承诺可能是个好主意,然后观察承诺。即:

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'); 
  })
})