在Jasmine的嵌套描述函数中不能引用全局函数

时间:2014-04-24 02:17:46

标签: javascript scope tdd jasmine

我正在使用Jasmine为一个javascript应用程序进行TDD。出于某种原因,我无法引用我在SpecRunner.html文件的源部分中声明的函数,如果它嵌套在两个describe函数中。

以下是代码:

describe("DidiButton", function(){
    var didiButtonDiv = document.createElement("div");
    didiButtonDiv.id = "DidiButtonDiv";

    it("should throw an UndefinedElementError if it isn't given a DOM", function(){
        try{
            var didiButton = createDidiButton();
        }
        catch(e){
            expect(e.name).toEqual("UndefinedElementError");
        }
    });

    it("should be able to associate itself with a DOM", function(){
        var didiButton = createDidiButton(didiButtonDiv);
        expect(didiButtonDiv).toEqual(didiButton.element);
    });

    describe("Link Functions", function(){
        var didiButton = createDidiButton(didiButtonDiv);
        var link = "http://www.google.com";

        it("should be able to set a link", function(){
            didiButton.setLink(link);
        });

        it("should be able to get the link set to it", function(){
            expect(link).toEqual(didiButton.getLink()); 
        });
    });

});

这是我得到的错误:

ReferenceError: createDidiButton is not defined in file:///Users/.../spec/DidiButtonSpec.js (line 20)

如果我删除 describe("Link Functions", function(){...}); 块,则测试通过。我用嵌套函数做了一个简单的测试,看看我是不是疯了;我在下面编写了脚本,并调用了 funcHi() 。它像我认为的那样工作,每个警报都能找到 message()

function message(){
    return "Hi";
}

function funcHi(){
    alert(message());
    function func1(){
        alert(message() + 1);
        function func2(){
            alert(message() + 2);
            function func3(){
                alert(message() + 3);
            }
            func3();
        }
        func2();
    }
    func1();
}

为什么茉莉花不能找到我的功能?

1 个答案:

答案 0 :(得分:0)

我明白了:Jasmine不理解对SpecRunner.html文件的源脚本中包含的文件的引用,除非它们在规范或it(...)函数中。如果我将其更改为以下内部描述块:

describe("Link Functions", function(){
    var didiButton;
    var link = "http://www.google.com";

    it("should be able to set a link", function(){
        didiButton = createDidiButton(didiButtonDiv);
        didiButton.setLink(link);
    });

    it("should be able to get the link set to it", function(){
        expect(link).toEqual(didiButton.getLink()); 
    });
});