模拟/伪造的ASP.NET服务参考和QUnit测试

时间:2010-10-06 18:20:47

标签: asp.net jquery qunit service-reference

我刚刚进入QUnit测试,并在我的第一页遇到问题:S

我们使用ASP.NET服务引用来利用html页面上的异步数据加载,在同一个项目中创建对Web服务的引用。 ASP.NET幕后工作(ScriptManager控件)是创建一个表示服务方法和处理所有AJAX调用的JS文件。

使用这个,我有一个页面,它在document.ready jQuery事件中调用其中一个方法。我现在正尝试使用QUnit测试此js文件,但避免让js文件调用实际的Web服务并使用模拟服务。以下是我到目前为止所做的尝试:

main.js(生产代码文件)

var Service;

$(document).ready(function () {

    //class definition created by asp.net behind the scenes
    Service = MyProject.services.DataService;

    //the method that calls the service
    LoadData();
});

function LoadData() {
    Service.GetData(OnGetDataSuccess, OnGetDataFailure);
}

main-test.js(测试QUnit代码,在此页面中引用main.js)

function SetupMockService(result) {
    Service = { "GetData": function (OnSuccess, OnFailure) {
            GetDataCalled = true;
            OnSuccess(result);
            //this is required in an asyncTest callback, I think?
            start();
        }, "GetDataCalled": false};
}
$(document).ready(function () {
    module("LoadData");
    asyncTest("LoadData should call GetData from service", function () {
        SetupMockService(result);
        LoadData();
        equals(Service.GetDataCalled, true, "GetData has been called");
    });

此测试失败。 LoadData方法作为原始(main.js)document.ready事件的一部分被调用,因此它仍然调用生产Web服务,并且测试失败,因为GetDataCalled变量从未设置(或在生产中定义)。我在做asyncTest错了吗? (这是我第一天使用QUnit,所以我很可能会这样做)

我能看到这个工作的另一种方式是,如果我可以覆盖main.js document.ready事件,但我不太清楚如何做到这一点。我也不想将“testEnvironment == true”检查添加到我的生产main.js代码中。

1 个答案:

答案 0 :(得分:0)

事实证明我的事情有点倒退,还有一个明显的错误。这是生成的代码

主tests.js

//the test itself isn't calling async methods, so it doesn't need to use asyncTest
test("LoadData should call GetData from service", function () {
    SetupMockService();
    LoadData();
    equals(Service.GetDataCalled, true, "GetData has been called");
});

function SetupMockService() {
    //redefining the Service variable specified in main.js with a mock object
    Service = { "GetData": function (OnSuccess, OnFailure) {
            //I forgot the "this" part... d'oh!
            this.GetDataCalled = true;
        }, "GetDataCalled": false
    };
}

这仍然无法解决原始main.js的document.ready代码正在执行的问题,但我会想出来的。