同步获取 Frisby.js 测试到 运行
Get Frisby.js tests to run synchronously
我的测试中有这些 API 调用需要先 运行 以便我可以将响应存储在一个变量中以备后用。但看起来我的测试是 运行ning 异步的,所以第二个测试在变量被填充之前完成。如何同步进行测试 运行?
我听说一种方法是使用 before
并传递 done
回调。但我不确定如何使用 jasmine-node
来做到这一点。
测试示例:
var dataID = '';
frisby.create('Get ID')
.get(url)
.expectStatus(200)
.afterJSON(function(json) {
dataID = json.id;
})
.toss();
frisby.create('Get data with ID')
.get(url, id)
.expectStatus(200)
.expectJSON({"id": dataID})
.toss();
编辑:
所以我尝试像这样进行测试,但 done()
回调似乎没有被调用。 (测试超时)
describe('API TEST', function() {
beforeEach(function(done) {
frisby.create('Get ID')
.get(url)
.expectStatus(200)
.afterJSON(function(json) {
dataID = json.id;
done(); //?
})
.toss()
});
it('should work', function() {
console.log('TEST');
}); //"timed out after 5000 msec waiting for spec to complete"
});
Jasmine 通过将一个特殊的 done
参数作为参数传递给测试函数来处理异步测试——您必须在异步部分完成时调用 done(即 done()
)。
这是一个使用 done 的示例测试:
describe('my test', function() {
it('completes on done', function(done) {
var a = 10;
// this would normally be a call to the code under test
setTimeout(function() {
a = 20;
}, 250);
setTimeout(function() {
expect(a).toEqual(20);
done();
}, 1000);
});
});
在 frisby.js 的情况下,异步测试似乎仍然是一个令人惊讶的问题。查看 github 存储库中的问题:
我最后做的是使用 async
库并在实际的 frisby 测试中做 .timeout(60000)
,如下所示:
async.series([
function(cb) {
frisby.create('Get ID')
.get(url)
.expectStatus(200)
.afterJSON(function(json) {
dataID = json.id;
cb();
})
.toss();
},
function() {
//other tests using id
}
]);
这有点晚了,但以防其他人可能有同样的问题。
您可以像这样将第二个测试嵌套到第一个测试的 afterJson()
中,以确保它在第一个测试完成后运行
frisby.create('Get ID')
.get(url)
.expectStatus(200)
.afterJSON(function(json) {
var dataID = json.id;
frisby.create('Get data with ID')
.get(url, id)
.expectStatus(200)
.expectJSON({"id": dataID})
.toss()
})
.toss();
我在此函数中为我做了较小的修改,但这适用于在 xml
中添加带有转义字符的节点
private void somefunctToReplaceTxtinExistingNode(Node tempNode, String texttobeSet){
String newtext = "<" + tempNode.getNodeName() + ">" + texttobeSet + "</" + tempNode.getNodeName() + ">";
// create of new temp document .node will be imported from this
DocumentBuilderFactory dbf = ....
DocumentBuilder builder = ..
Document newDoc = builder.parse(new StringBufferInputStream(texttobeSet));
Node nodeXmlWithEscapeChars = newDoc.getFirstChild();
// Import the node in old doc
Document document = tempNode.getOwnerDocument();
Node impNode = document.importNode(nodeXmlWithEscapeChars, true);
// lastly . delete old with
Node parent = tempNode.getParentNode();
parent.removeChild(tempNode);
parent.appendChild(impNode);
}
我的测试中有这些 API 调用需要先 运行 以便我可以将响应存储在一个变量中以备后用。但看起来我的测试是 运行ning 异步的,所以第二个测试在变量被填充之前完成。如何同步进行测试 运行?
我听说一种方法是使用 before
并传递 done
回调。但我不确定如何使用 jasmine-node
来做到这一点。
测试示例:
var dataID = '';
frisby.create('Get ID')
.get(url)
.expectStatus(200)
.afterJSON(function(json) {
dataID = json.id;
})
.toss();
frisby.create('Get data with ID')
.get(url, id)
.expectStatus(200)
.expectJSON({"id": dataID})
.toss();
编辑:
所以我尝试像这样进行测试,但 done()
回调似乎没有被调用。 (测试超时)
describe('API TEST', function() {
beforeEach(function(done) {
frisby.create('Get ID')
.get(url)
.expectStatus(200)
.afterJSON(function(json) {
dataID = json.id;
done(); //?
})
.toss()
});
it('should work', function() {
console.log('TEST');
}); //"timed out after 5000 msec waiting for spec to complete"
});
Jasmine 通过将一个特殊的 done
参数作为参数传递给测试函数来处理异步测试——您必须在异步部分完成时调用 done(即 done()
)。
这是一个使用 done 的示例测试:
describe('my test', function() {
it('completes on done', function(done) {
var a = 10;
// this would normally be a call to the code under test
setTimeout(function() {
a = 20;
}, 250);
setTimeout(function() {
expect(a).toEqual(20);
done();
}, 1000);
});
});
在 frisby.js 的情况下,异步测试似乎仍然是一个令人惊讶的问题。查看 github 存储库中的问题:
我最后做的是使用 async
库并在实际的 frisby 测试中做 .timeout(60000)
,如下所示:
async.series([
function(cb) {
frisby.create('Get ID')
.get(url)
.expectStatus(200)
.afterJSON(function(json) {
dataID = json.id;
cb();
})
.toss();
},
function() {
//other tests using id
}
]);
这有点晚了,但以防其他人可能有同样的问题。
您可以像这样将第二个测试嵌套到第一个测试的 afterJson()
中,以确保它在第一个测试完成后运行
frisby.create('Get ID')
.get(url)
.expectStatus(200)
.afterJSON(function(json) {
var dataID = json.id;
frisby.create('Get data with ID')
.get(url, id)
.expectStatus(200)
.expectJSON({"id": dataID})
.toss()
})
.toss();
我在此函数中为我做了较小的修改,但这适用于在 xml
中添加带有转义字符的节点private void somefunctToReplaceTxtinExistingNode(Node tempNode, String texttobeSet){
String newtext = "<" + tempNode.getNodeName() + ">" + texttobeSet + "</" + tempNode.getNodeName() + ">";
// create of new temp document .node will be imported from this
DocumentBuilderFactory dbf = ....
DocumentBuilder builder = ..
Document newDoc = builder.parse(new StringBufferInputStream(texttobeSet));
Node nodeXmlWithEscapeChars = newDoc.getFirstChild();
// Import the node in old doc
Document document = tempNode.getOwnerDocument();
Node impNode = document.importNode(nodeXmlWithEscapeChars, true);
// lastly . delete old with
Node parent = tempNode.getParentNode();
parent.removeChild(tempNode);
parent.appendChild(impNode);
}