实际上我正在编写一个小的JS lib来封装一些GET和POST调用到外部Web服务。有没有一种好方法/最佳实践如何测试这样的库? 我应该针对GET函数针对API编写测试吗?我应该在测试目录中放置示例响应吗?
P.S。:我无法向API发送POST请求,因为它是“LIVE”系统。
答案 0 :(得分:0)
你会想要使用某种单元测试框架,正如@BrianDriscoll评论的那样。那里有很多。
我也遇到了这个问题,我没有找到适合JavaScript的AJAX模拟框架。我最终创建了 Mocking Bird 。
使用MockingBird模拟请求的优势
<强>缺点强>
一个快速而又肮脏的例子:
var request = new MockingBird.XMLHttpRequest()
.returnsStatus(200)
.returnsBody('{"message":"I am a teapot"}')
.returnsHeaders({
"Content-Type": "text/json"
});
callSomeFunctionThatUsesAjax(request);
function callSomeFunctionThatUsesAjax(xhr) {
xhr.onreadystatechange = function() {
...
};
xhr.open("POST", "/foo");
xhr.send(null);
}
如果无法提供自己的AJAX对象,也可以为案例设置模拟调用:
MockingBird.XMLHttpRequest.disableNetworkConnections()
.mock("/posts/123", "GET", {
status: 404,
body: "Page not found"
})
.mock("/posts/321/comments", "POST", {
status: 201,
responseHeaders: {
"Content-Type": "text/json"
},
body: {
post: {
id: 321,
comment: {
id: 1234
}
}
}
});
现在,直接实例化XMLHttpRequest
对象的代码甚至不需要知道MockingBird存在:
function createComment(postId, text) {
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (this.readyState !== 4) return;
if (this.status === 201) {
var data = JSON.parse(this.responseText);
alert("Created comment: " + data.post.comment.id);
}
else if (this.status === 404) {
alert("Post " + postId + " not found!");
}
};
xhr.open("POST", "/posts/" + postId);
xhr.send("post[id]=" + postId + "&post[comment][text]=" + escape(text));
}
createComment(123, "Test Test"); // alert's "Post 123 not found!"
createComment(321, "Test Test"); // alert's "Created comment: 1234"