2

第一次使用Jasmine,还在尝试处理事情。使用 2.0.0 独立版本。我的 SpecRunner.html 中有以下几行:

//... jasmine js files included here ...
<!-- include source files here... -->
<script type="text/javascript" src="lib/jasmine-jquery.1.3.1.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="src/admin.js"></script>
//... the rest of my scripts, and then my specs ...

所以我肯定包括我的 admin.js 文件,我在其中声明了以下一组函数:

$(function() {
    function deleteLink(linkHref, callback) {
        $.ajax({
            type: "POST",
            url: "/delete?href=" + linkHref,
            success: callback
        });
    }

    function redirectHome() {
        location.assign("/");
    }

    $('.delete_button').on('click', function() {
        var buttonUrl = $(this).parent().data('link-href');
        if( confirm("Are you sure you want to remove this link?") ) {
            deleteLink(buttonUrl, redirectHome);
        }
    });
});

我正在尝试使用用于测试 AJAX 回调的建议格式来测试此功能(它在浏览器中完全符合我的预期) :

describe("Admin library", function() {
    describe(".delete_button event handling", function() {
        beforeEach(function() {
            loadFixtures("delete_button.html");
        });

        // other tests here...

        it("should set the location to /", function() {
            spyOn($, "ajax").and.callFake(function(e) {
                e.success();
            });
            var callback = jasmine.createSpy();
            deleteLink("http://some.link.href.com", callback);
            expect(callback).toHaveBeenCalled();
        });
    });
});

但是,测试总是失败并出现以下错误:

Can't find variable: deleteLink in file:///path/to/my/app/jasmine/spec/adminSpec.js

我目前正在测试未在这些文件中明确声明的其他 jasmine/spec 文件中的函数。我认为这就是将脚本包含在 SpecRunner.html 文件中的意义所在,对吧?关于这里发生了什么的任何想法?

4

1 回答 1

3

deleteLink函数不是全局的。它在闭包内声明(在您的情况下,它是一个自调用函数)。如果你想让这个函数全局化,你需要在你的“admin.js”文件中添加这个闭包:

window.deleteLink = deleteLink;
于 2014-01-07T20:58:47.997 回答