Javascript 茉莉花期待着不经过也不接住 试图在量角器中使用expect(fn).toThrow()。

Javascript 茉莉花期待着不经过也不接住 试图在量角器中使用expect(fn).toThrow()。,javascript,exception,jasmine,promise,protractor,Javascript,Exception,Jasmine,Promise,Protractor,我传递的函数(fn)返回一个promise(量角器.promise.defer),量角器应该强制expect()正确处理该函数 在运行时,它不会捕获错误和/或通过测试,而不会捕获错误和/或通过测试。 “预期函数将引发错误” “等待在约3000毫秒后超时” (由browser.wait()的超时参数引发) 我试过使用: deferred.reject()引发可捕获错误 通常通过在有前途的函数上使用.thenCatch()而不是.then()来捕获 deferred.fulfill()

我传递的函数
(fn)
返回一个promise(
量角器.promise.defer
),量角器应该强制
expect()
正确处理该函数

在运行时,它不会捕获错误和/或通过测试,而不会捕获错误和/或通过测试。
  • “预期函数将引发错误”
  • “等待在约3000毫秒后超时”
    • (由
      browser.wait()
      的超时参数引发)
我试过使用:
  • deferred.reject()
    引发可捕获错误
    • 通常通过在有前途的函数上使用
      .thenCatch()
      而不是
      .then()
      来捕获
  • deferred.fulfill()
    并“手动”在函数中抛出错误
    • 使用语法
      抛出新错误()
    • 抛出{name:'Error',message:'timed out'}
    • 抛出{name:'Exception'}
  • 我已尝试删除
    .fulfill()
    .reject()
    ,这意味着expect继续运行的唯一方法是抛出错误
  • 我甚至删除了所有
    return
    语句,这样
    expect
    就不会完成函数,除非它抛出错误
  • 更新:尝试使用
    .tothrower()
    而不是
    .toThrow()
  • 更新:尝试通过自定义匹配器重写
    .toThrow()
    ,但我不知道如何在
    中生成匿名函数。然后catch()
    使原始匹配器返回其
    结果
    对象,而不返回承诺
每次expect失败,错误仍然被抛出且未被抛出(与语法所说的完全相同)

我的直觉是:
  • 对于这种情况,量角器是否正确地覆盖了expect
    expect
  • 是因为
    抛出
    发生在传递给
    的匿名函数中,然后(function(){/*error shown here*/})
    而不是原始的
    fn
    函数吗
  • 我可以让茉莉花定制匹配者承诺稍后返回结果吗?(量角器也解释了这些承诺吗?)
  • 还是我忽略了这么简单的事情

假设您的承诺稍后会实现/拒绝(异步),您不能依赖
expect(function(){..}.toThrow()
在这种情况下工作

我会这样做(不习惯于拖延承诺):

假设这就是用量角器捕捉错误的方式

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

可能有助于更清晰的语法,例如:

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

.thenCatch(function(error){}}
将是使用的语法。我已经考虑过了,但这是一个非常丑陋的hack,不适合重用。使用
expect(true).toBe(false)
没有为测试结果提供任何有用的信息。这确实是一个难题,但是除非量角器提供自定义的异步期望值,否则您必须如何处理异步过程?关于第二点,您希望得到比使用
expect().toThrow()得到的信息更多的信息吗
如果进程没有抛出异常?可以用
expect(function(){return true})替换它。toThrow()
如果需要?量角器只是自动强制
expect(actual)中的
实际值
在使用matcher之前要解决的问题,这就是matcher提供的全部内容。关于我的第二点,我意识到我过于理想化了。它目前没有提供任何有用的额外信息。我的意思是说“这不是一个黑客行为”。这就是处理异步过程的方式,以后可能会失败。因此使用done方法。在以前版本的jasmine中,您必须使用
run(…)
waitFor(…)
组合…这对于多个异步进程来说非常糟糕…测试用例不可读…我会记住Chai,但出于我的目的,不值得从jasmine切换。现在回想起来,我不需要
toThrow()
或在检查元素是否存在时使用承诺匹配器(我只需要
thenCatch()
超时)。
expect(fn_returning_promise()).to.eventually.be.rejectedWith(...)