javascript – Jasmine期望不要传球也不能抓住

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

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

在运行时,它不会捕获错误和/或通过测试,也不会.

>“抛出错误的预期功能”
>“大约3000ms后等待超时”

>(由browser.wait()的超时参数抛出)

我尝试过使用:

> deferred.reject(),它会抛出一个捕获错误

>通常使用.thenCatch()代替.then()来捕获有希望的函数

> deferred.fulfill()并在“手动”函数中抛出错误

>使用语法抛出新的Error();
>并抛出{name:’Error’,消息:’timed out’}
>并抛出{name:’Exception’}

>我已经尝试删除.fulfill()和.reject(),这意味着期望继续前进的唯一方法是抛出错误.
>我甚至删除了所有返回语句,因此除非它抛出错误,否则期望不会完成该函数.
>更新:尝试使用.toThrowError()而不是.toThrow()
>更新:尝试通过自定义匹配器覆盖.toThrow(),但我不知道如何在.thenCatch()中创建匿名函数使原始匹配器返回其结果对象而不返回promise.

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

我的预感是:

>对于这种情况,量角器是否不能超越预期?
>是因为抛出是在一个匿名函数中传递给.then(函数(){/ *这里抛出的错误* /})而不是原始的fn函数?
>我可以让茉莉花自定义匹配器返回一个承诺,以便稍后返回结果吗? (量角器也会考虑那些承诺吗?)然后我会覆盖原来的.toThrow()方法来解释这种可能性.
>或者我只是忽略那么简单的事情?

最佳答案 假设您的承诺将在以后(异步)中完成/拒绝,您不能依赖期望(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()方法.

点赞