在Vows.js中,如何在完成异步回调后恢复原始主题?

时间:2011-10-03 21:34:49

标签: node.js bdd vows

说我有以下顺序:

vows.describe('Example').addBatch({
   'An example' : {
      topic: new Example(),
      'with an async method' : function(example) {
         example.asyncMethod(this.callback);
      },
      'will do some magic' : function(err, result) {
         assert.equal(result.magical, true);
      },
      'and then we will be back on track' : function(example) {
         assert.isTrue(example.backOnTrack); 
      }
   }
}).run();

测试“and then we will be back on track”是否可以使用之前的主题(Example)?

修改

vows.describe('Example').addBatch({
   'An example' : {
      topic: function(example){ // <- where example is a parent topic
         example.asyncMethod(this.callback);
      },    
      'callback after an async method will do some magic' : function(err, result) {
         assert.equal(result.magical, true);
      },
      'and then we will be back on track' : function(example) {
         assert.isTrue(example.backOnTrack); 
      }
   }
}).run();

2 个答案:

答案 0 :(得分:3)

主题会返回一个主题,该主题将发送给您的所有誓言。

首先发誓"with an async method" this.callback是未定义的,因为回调仅在主题中定义。在第二个誓言中,参数是example而不是err, result

如果您要进行任何异步测试,则需要为主题设置功能并使用this.callback或从主题中返回EventEmitter

修改

您遇到的问题是从誓言中返回多个主题。这是不可能的。

最简单的解决方案是返回一个包含两个主题的数组的新主题。这感觉很乱。

更好的解决方案是确保您单独测试您的主题。基本上你的测试是“副作用”已成功发生。副作用永远不会发生

答案 1 :(得分:0)

据我了解,topic是否使用简单的topic: somethingtopic: function(...语法,仅执行一次。当誓言按顺序执行时,在第二个示例中,您将处理修改后的example

我会采用简单但有点烦人的方法将两个测试分成子上下文并有两个topic: new Example()个实例。