茉莉希望不要过去也不要追赶

时间:2015-07-23 18:15:05

标签: javascript exception jasmine promise protractor

尝试在量角器中使用expect(fn).toThrow()

我通过的函数(fn)会返回一个承诺(protractor.promise.defer),量角器可能会强制expect()正确处理。

运行时,它不会捕获错误和/或通过测试,而是

  • "抛出错误的预期功能"
  • "在~3000ms之后等待超时"
    • (由browser.wait()超时参数引发)

我尝试过使用:

  • deferred.reject()会引发一个捕获错误
    • 通常在有前途的功能上使用.thenCatch()代替.then()来抓住
  • deferred.fulfill()并在函数中抛出错误"手动"
    • 使用语法throw new Error();
    • throw {name: 'Error', message: 'timed out'}
    • throw {name: 'Exception'}
  • 我尝试删除.fulfill().reject(),这意味着期望继续前进的唯一方法是抛出错误。
  • 我甚至删除了所有return语句,以便expect赢得该功能,除非它抛出错误。
  • 更新:尝试使用.toThrowError()代替.toThrow()
  • 更新:尝试通过自定义匹配器覆盖.toThrow(),但我不知道如何在.thenCatch()中创建匿名函数使原始匹配器返回其{{1}没有返回承诺的对象。

每次期望失败错误仍然被抛出并且未被捕获(正如语法所说的那样,它将被抛出)。

我的预感是:

  • 对于这种情况,量角器是否未正确覆盖result
  • 是因为expect发生在传递给throw而不是原始.then(function(){ /*error thrown here*/ })函数的匿名函数中吗?
  • 我可以让jasmine自定义匹配器返回一个承诺,以便稍后返回结果吗? (量角器也会考虑这些承诺吗?)然后我会覆盖原来的fn方法来考虑这种可能性。
  • 或者我只是忽略 简单的东西?

2 个答案:

答案 0 :(得分:1)

假设您的承诺将在稍后的时间内完成/拒绝(异步),那么在这种情况下您无法依赖expect(function() {..}.toThrow()

我会做的是这样的事情(不用于量角器承诺):

it('.....', function(done) {
    MyPromise(...)
        .then(... my normal process which should throw....)
        .then(function() { 
                   // Error not thrown by the process, so fail the test.
                   expect(true).toBe(false);
              },
              function(err) {
                   // Expected error thrown so pass the test.
                   done();
              });
});

假设这是你用量角器承诺错误的方法吗?

其他一些实现有一个.catch()方法可以链接。

答案 1 :(得分:1)

Chai as Promised可能有助于提供更清晰的语法,例如类似的东西:

expect(fn_returning_promise()).to.eventually.be.rejectedWith(...)