我刚刚进入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代码中。
答案 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代码正在执行的问题,但我会想出来的。