同步获取 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 存储库中的问题:

open frisby issues involving async

我最后做的是使用 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);
}