我知道Node完全是关于回调的。我在创建Jasmine测试时试图记住这一点,因为我对Jasmine和Node有了更多的了解。
我使用jasmine-node写了一个非常基本的测试,它应该是一个HTML页面,使用' cheerio'加载和解析返回的HTML,并提取HTML元素的内容。我的测试应该验证' cheerio'返回的文本的准确性。
我发现我正在测试的功能正在返回' undefined'在请求完成之前。您可以在测试的输出中看到这一点。在测试报告失败后,您会看到console.log输出。
我尝试使用回调来解决此问题,并且我已经看过有关使用“async'”等库的帖子。我尝试使用beforeEach()来存储测试数据。
我还没找到正确的食谱,我需要一些帮助。
<!doctype html>
<html>
<body>
<span class="title">Title Goes Here</span>
</body>
</html>
var request = require('request');
var cheerio = require('cheerio');
exports.whoAmI = function () {
'use strict';
return "module1";
};
exports.testJq = function () {
'use strict';
var tipsotext = function (callback) {
var output;
request.get('http://localhost/test-test/index.html', function optionalCallback(err, httpResponse, body) {
var $ = cheerio.load(body);
output = $('.title').text();
console.log("Executing callback with data: " + output);
callback(null, output);
});
};
tipsotext(function (err, data) {
console.log("Returning with data: " + data);
return data;
});
};
var module1 = require("../src/module1.js");
describe("module1", function () {
'use strict';
it("should identify itself with whoAmI", function () {
var test;
test = module1.whoAmI();
expect(test).toBe("module1");
});
it("should get data from the page", function () {
var test;
test = module1.testJq();
expect(test).toBe("Title Goes Here");
});
});
Failures:
1) module1 should get data from the page
Message:
Expected undefined to be 'Title Goes Here'.
Stacktrace:
Error: Expected undefined to be 'Title Goes Here'.
at null.<anonymous> (c:\test-test\spec\module1-spec.js:14:22)
Finished in 0.011 seconds
2 tests, 2 assertions, 1 failure, 0 skipped
Executing callback with data: Title Goes Here
Returning with data: Title Goes Here
答案 0 :(得分:0)
tipsotext(function (err, data) {
console.log("Returning with data: " + data);
return data;
});
此函数将数据返回到他的匿名函数=&gt;函数(错误,数据),因为这个方法是异步的,我认为你应该重新测试你的测试以支持异步方法并向testJq函数添加一个回调参数。
答案 1 :(得分:0)
我重新构建了我的模块,并测试让它们至少通过测试。我不确定它是编写模块的最佳方式,但这是向正确方向迈出的一步,并演示了一种编写Jasmine测试的方法,该测试用于检查异步请求返回的值。
我的大部分更改都来自Test Asynchronous Methods Using the Jasmine runs() and waitFor() Methods
我在这里做了很多菜鸟动作吗?任何有建议修复任何东西的专业人士吗?
var request = require('request');
var cheerio = require('cheerio');
var title;
exports.whoAmI = function () {
'use strict';
return "module1";
};
exports.extractTitleFromBody = function (callback) {
'use strict';
request({
url: 'http://localhost:63342/browserify-test/index.html', //URL to hit
method: 'GET'
}, function(error, response, body){
if(error) {
title = error;
} else {
var $ = cheerio.load(body);
title = $('.title').text();
}
if (typeof callback === "function") {
callback();
}
});
};
exports.getTitle = function () {
'use strict';
return title;
};
var module1 = require("../src/module1.js");
describe("module1", function () {
'use strict';
it("should identify itself with whoAmI", function () {
var me;
me = module1.whoAmI();
expect(me).toBe("module1");
});
it("should make a real AJAX request and return the title", function () {
var callback = jasmine.createSpy("spy");
module1.extractTitleFromBody(callback);
waitsFor(function() {
return callback.callCount > 0;
}, "The request timed out.", 5000);
runs(function() {
expect(callback).toHaveBeenCalled();
});
runs(function() {
expect( module1.getTitle()).toBe("Title Goes Here");
});
});
});