试图在量角器中使用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()方法.