我已经采用了一个名为f.js的随机nodejs代码并为此编写单元测试。 节点js代码在下面,
//storing the information in temporary memory
var http = require("http");
var url = require("url");
var parsedUrl = url.parse('/itemsAvailable?model=nokia', true)
// href: '/itemsAvailable?model=nokia',
//search: '?model=nokia',
//query: {model: 'nokia'},
//pathname: '/itemsAvailable'
//information of the user
function reset() {
var d = new Date();
var date = d.getDate();
var hour = d.getHours();
var min = d.getMinutes();
//var time = hour + ':'+min;
//console.log(date,itemsAvailable[2].count,itemsAvailable[2].userId);
if (hour == 16 && min == 52) {
itemsAvailable[2].count = 0;
}
}
exports.reset = reset;
var itemsAvailable = [{
model: 'nokia',
available: 10
},
{
model: 'samsung',
available: 20
},
{
userId: 1234,
count: 0, //initially assigning count to 0
model: "",
}
]; //create an object to store the itemsAvailable
exports.itemsAvailable = itemsAvailable;
var server = http.createServer(function(req, res) {
reset(); //calling the reset after every request
res.write("hello\n");
if (itemsAvailable[2].count == 0) {
if (parsedUrl.query.model === 'nokia' && itemsAvailable[0].available != 0) { //parsedUrl.query gives an object and .model gives nokia
res.write("item chosen is nokia\n")
res.write("item can be bought");
itemsAvailable[2].count++; // increasing the num of mobiles bought
console.log(itemsAvailable[2].count);
itemsAvailable[0].available--;
console.log(itemsAvailable[0].available)
}
} else {
res.write("u cannot buy the item today come back tomorrow");
}
res.end()
}).listen(3000);
exports.server = server;
我写的测试代码在下面
var assert = require("chai").assert;
var http = require("http");
var Code = require("../f");
describe("itemsAvailable", function() {
it("information count", function() {
assert.equal(Code.itemsAvailable[2].count, 0);
})
});
describe("information count", function() {
it("reset", function() {
if (Code.reset.hour == 16 && Code.reset.min == 52) {
assert.equal(Code.reset.itemsAvailable[2].count, 0);
}
});
})
describe('/', function() {
before(function(done) {
Code.server.listen(3000, done);
});
after(function(done) {
Code.server.close();
});
describe("http request", function() {
it('buy the item', function(done) {
http.get("http://localhost:3000", function(res) {
//assert.equal(Code.server.res,'hello');
try {
if (Code.itemsAvailable[2].count == 0) {
if (Code.parsedUrl.query.model == 'nokia' && Code.itemsAvailable[0].available != 0) {
it("item can be bought", function(done) {
assert.equal(Code.server.res, 'item chosen is nokia');
assert.equal(Code.server.res, 'item can be bought');
done();
})
}
};
} catch (error) {
it("item can not be bought", function(done) {
assert.equal(Code.server.res, 'u cannot buy the item today come back tomorrow');
done();
})
}
})
done();
})
});
})
我得到了错误
3次传球,1次失败 1)毕竟钩子未被捕获错误:错误econnrefused 127.0.0.1:3000
我正在听3000端口。只有nodejs代码可以正常工作。我刚刚开始学习摩卡单元测试,有人可以解释为什么会出现这种错误,并且可以在上面的单元测试代码中做出哪些改变来摆脱错误。
答案 0 :(得分:1)
您的代码中存在多个错误:
您无法嵌套it
次来电。 Mocha根本不支持这样的嵌套,如果你尝试它会表现不正常。
在测试buy the item
中,您致电done
以外的回复http.get
。这是错的。它会导致您的测试过早结束。
此是导致错误的直接原因。问题是http.get
仅保证将来某个未确定点的结果 。通过提前完成测试,Mocha会转到你的after
钩子。 (嵌套在it
测试中的两个buy the item
测试无关紧要:此时Mocha甚至知道关于这些嵌套测试。)所以Mocha认为你的测试完成,并执行关闭服务器的after
挂钩,然后执行 ,它会尝试运行由于服务器关闭而失败的http.get
请求。错误在after
挂钩中报告为错误,因为当http.get
失败时,Mocha处于执行顺序中。
您未能在done
挂钩中致电after
。
您的describe('/'
区块应该像这样构建,而不是您目前拥有的区域:
describe('/', function() {
before(function(done) {
Code.server.listen(3000, done);
});
after(function(done) {
// Make sure to call the done callback after the server is closed.
Code.server.close(done);
});
describe("http request", function() {
it('buy the item', function(done) {
http.get("http://localhost:3000", function(res) {
// Perform your tests here.
// You must have your done call **inside** the callback to
// http.get.
done();
});
});
});
});
您可以在其中添加it
次http.get
次请求,以涵盖您要覆盖的所有案例。