我的测试中有这些需要先运行的API调用,因此我可以将响应存储在变量中以便以后使用。但看起来我的测试是异步运行的,所以第二次测试在变量填充之前完成。如何使测试同步运行?
我听说过一种方法是使用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"
});
答案 0 :(得分:3)
我最终做的是使用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
}
]);
答案 1 :(得分:2)
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 repo上的问题:
答案 2 :(得分:0)
这有点晚,但万一其他人可能有同样的问题。
您可以将第二个测试嵌套到第一个测试的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();
答案 3 :(得分:0)
我在这个函数中对我进行了较小的修改,但这适用于在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);
}