javascript - Jasmine 的 toThrow 匹配器是否需要将参数包装在匿名函数中?

标签 javascript jasmine

文档位于 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/

相关文章:

angularjs - 如何在 Jasmine 和 Angular 中模拟 $http 超时

angular - 使用 Jasmine 在 Angular 8 中测试异步代码时如何等待?

javascript - 检查字符串中的输入值

javascript - 使用 JQuery Ajax 提交表单仍然显示目标页面

javascript - 单一主干 View 中的多个集合

javascript - 如何在Sinon JS中延迟假后端的特定响应

html - 未捕获的类型错误 : Cannot read property 'env' of undefined

javascript - Angular 服务的 Jasmine 测试无法解决延迟调用

javascript - 以二进制计数

javascript - 如何为未知 JSON 数据自动添加制表符列设置