Node Jasmine 2.0 和多个条件
Node Jasmine 2.0 and multiple conditions
Jasmine 有这种时髦的方法论,即在测试中第一次失败时不停止。这在一般情况下很好,但并非没有问题。我想知道对于这样的场景最佳实践是什么:
it('should process async results nicely', function (done) {
this.getJSON('something', function(response) {
expect(response.status).toEqual('ok');
expect(response.data).toBeDefined();
expect(response.data.length).toEqual(5);
done();
}
}
这里的问题是,如果 response.data 未定义,这将导致整个测试套件崩溃。再一次,在测试用例中编写条件通常是不受欢迎的。对于这种情况,我还有其他选择吗?鉴于大多数测试的异步性质,这是一个非常普遍的问题。
也许这样的事情可以解决问题:
it("should make a real AJAX request", function () {
var callback = jasmine.createSpy();
makeAjaxCall(callback);
waitsFor(function() {
return callback.callCount > 0;
}, "The Ajax call timed out.", 5000);
runs(function() {
expect(callback).toHaveBeenCalled();
});
});
function makeAjaxCall(callback) {
$.ajax({
type: "GET",
url: "data.json",
contentType: "application/json; charset=utf-8"
dataType: "json",
success: callback
});
}
如果您遵守 OAPT(每次测试一个断言),您就不会遇到这个问题(认为您可能会遇到其他问题。)
var resp = null;
beforeEach(function(){
this.getJSON('something', function(response){
resp = response;
});
});
it('should have a defined response', function(){
expect(resp).toBeDefined();
});
it('should have a status of OK:', function(){
expect(resp.status).toEqual('ok');
});
it('should have data:', function(){
expect(resp.data).toBeDefined();
});
it('should have a data length of 5', function(){
expect(resp.data.length).toEqual(5);
});
关于如何处理变量,这可能不是 100% 准确,但它应该能让您大致了解。如果第一个失败(期望定义 resp 变量),您就知道您的 .getJSON 函数有问题。这应该有效,因为即使变量设置为 null,它仍然被定义。如果您的函数失败,它会将变量设置为未定义,从而使测试失败。
问题基本上是 AJAX 块中的错误被抛出了 it() 块的上下文,因此没有被捕获。解决方案是在执行 AJAX 调用的函数中编写一些自定义错误处理,并通过传递给 it 块的 'done' 使其成功或失败。
Jasmine 有这种时髦的方法论,即在测试中第一次失败时不停止。这在一般情况下很好,但并非没有问题。我想知道对于这样的场景最佳实践是什么:
it('should process async results nicely', function (done) {
this.getJSON('something', function(response) {
expect(response.status).toEqual('ok');
expect(response.data).toBeDefined();
expect(response.data.length).toEqual(5);
done();
}
}
这里的问题是,如果 response.data 未定义,这将导致整个测试套件崩溃。再一次,在测试用例中编写条件通常是不受欢迎的。对于这种情况,我还有其他选择吗?鉴于大多数测试的异步性质,这是一个非常普遍的问题。
也许这样的事情可以解决问题:
it("should make a real AJAX request", function () {
var callback = jasmine.createSpy();
makeAjaxCall(callback);
waitsFor(function() {
return callback.callCount > 0;
}, "The Ajax call timed out.", 5000);
runs(function() {
expect(callback).toHaveBeenCalled();
});
});
function makeAjaxCall(callback) {
$.ajax({
type: "GET",
url: "data.json",
contentType: "application/json; charset=utf-8"
dataType: "json",
success: callback
});
}
如果您遵守 OAPT(每次测试一个断言),您就不会遇到这个问题(认为您可能会遇到其他问题。)
var resp = null;
beforeEach(function(){
this.getJSON('something', function(response){
resp = response;
});
});
it('should have a defined response', function(){
expect(resp).toBeDefined();
});
it('should have a status of OK:', function(){
expect(resp.status).toEqual('ok');
});
it('should have data:', function(){
expect(resp.data).toBeDefined();
});
it('should have a data length of 5', function(){
expect(resp.data.length).toEqual(5);
});
关于如何处理变量,这可能不是 100% 准确,但它应该能让您大致了解。如果第一个失败(期望定义 resp 变量),您就知道您的 .getJSON 函数有问题。这应该有效,因为即使变量设置为 null,它仍然被定义。如果您的函数失败,它会将变量设置为未定义,从而使测试失败。
问题基本上是 AJAX 块中的错误被抛出了 it() 块的上下文,因此没有被捕获。解决方案是在执行 AJAX 调用的函数中编写一些自定义错误处理,并通过传递给 it 块的 'done' 使其成功或失败。