文档位于 https://github.com/pivotal/jasmine/wiki/Matchers 包括以下内容:
expect(function(){fn();}).toThrow(e);
如 this question 中所述,下面的代码不起作用,因为我们想传递一个函数对象给expect
,而不是调用fn()
的结果:
expect(fn()).toThrow(e);
以下是否有效?
expect(fn).toThrow(e);
如果我用 doIt
方法定义了一个对象 thing
,下面的操作是否有效?
expect(thing.doIt).toThrow(e);
(如果是这样,有没有办法将参数传递给 doIt
方法?)
根据经验,答案似乎是肯定的,但我不相信我对 JavaScript 作用域的理解足够确定。
最佳答案
我们可以通过使用 Function.bind
来取消匿名函数包装器,它在 ECMAScript 5 中被引入。 .这适用于最新版本的浏览器,您可以通过自己定义函数来修补旧浏览器。 Mozilla Developer Network 中给出了示例定义.
这是一个如何将 bind
与 Jasmine 一起使用的示例。
describe('using bind with jasmine', function() {
var f = function(x) {
if(x === 2) {
throw new Error();
}
}
it('lets us avoid using an anonymous function', function() {
expect(f.bind(null, 2)).toThrow();
});
});
提供给 bind
的第一个参数在调用 f
时用作 this
变量。调用时,任何其他参数都会传递给 f
。这里 2
作为第一个也是唯一的参数被传递。
关于javascript - Jasmine 的 toThrow 匹配器是否需要将参数包装在匿名函数中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9500586/