已在 SO 和其他论坛上搜索此问题的答案。没有找到解决方案。
我遇到了 Jasmine 无法在 jQuery 代码块内找到函数的问题,无论 Jasmine 代码是否在 jQuery 函数内。
$(function() {
function foo(param1, param2) {
// some code
}
describe("Foo function", function () {
spyOn(window, 'foo');
foo(1, 2);
it("Should be found by Jasmine", function(){
expect(window.foo).toHaveBeenCalled();
});
});
});
Error: foo() method does not exist
我还尝试了 spyOn($, 'foo')
、spyOn($.fn, 'foo')
等。
另外,下面的代码也不起作用。
$(function() {
function foo(param1, param2) {
// some code
}
});
describe("Foo function", function () {
spyOn(window, 'foo');
foo(1, 2);
it("Should be found by Jasmine", function(){
expect(window.foo).toHaveBeenCalled();
});
});
那么如何使这两个代码块工作(即 Jasmine 代码在 jQuery 函数内部的位置,以及它在 jQuery 函数外部的位置)?
最佳答案
我讨厌回答我自己的问题,但我宁愿这样也不愿其他人不从我的错误中吸取教训。
这里有两个问题:
- Jasmine 需要一个包含对象
- 您不能访问 JS 函数范围之外的函数/变量
1 - Jasmine spy 需要使用一个容器对象,如果找不到,你只需要自己制作一个。所以下面的代码有效:
// Using Jasmine inside of a jQuery anon function
$(function () {
function foo() {
// Some code
}
describe("Foo function", function () {
it("Should be findable by Jasmine", function () {
var Thing = {}
Thing.foo = foo;
spyOn(Thing, 'foo');
Thing.foo(2)
expect(Thing.foo).toHaveBeenCalled();
});
});
});
2 - 如果在 jQuery anon 函数之外有 describe
block ,它将无法访问 jQuery block 内的任何值,因此上面的第二个代码示例将不会工作,无论你做什么。
关于javascript - Jasmine spyOn - jQuery 匿名函数中不存在方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24748702/