2017-08-18 44 views
1

我在我的describe有这样的代码:before(a)为什么Mocha的`before()`函数传递是否带参数?

a看起来是这样的:

function a() { 
    return chai.request(app) 
    ... 
    .then(res => { 
     res.blah.should.blah; 
     return Promise.resolve(); 
    }); 
} 

...一切的伟大工程(这是一个非常快速的调用)

然而,当我做a采取一些输入变量:

function a(dummy, my_var) { 
    return chai.request(app) 
    ... // use my_var here 
    .then(res => { 
     res.blah.should.blah; 
     console.log("finished!"); 
     return Promise.resolve(); 
    }); 
} 

承诺永远不会解决。两种意见:

  1. finished!确实获得正确输出(立即)
  2. dummy填充。

它填充了这一点:

function (err) { 
    if (err instanceof Error || toString.call(err) === '[object Error]') { 
     return done(err); 
    } 
    if (err) { 
     if (Object.prototype.toString.call(err) === '[object Object]') { 
      return done(new Error('done() invoked with non-Error: ' + JSON.stringify(err))); 
     } 
     return done(new Error('done() invoked with non-Error: ' + err)); 
    } 
    if (result && utils.isPromise(result)) { 
     return done(new Error('Resolution method is overspecified. Specify a callback *or* return a Promise; not both.')); 
    } 
    done(); 
} 

我不知道在哪里,从准确的,但我并不需要它,这就是为什么我只是把它变成一个虚拟变量。

现在我怀疑这与它有关,但我想知道为什么我的解决方法不能在这里实现这个诀窍。

我仍然希望使用before(a)作为默认情况,而不是my_var未定义。当我真的想通过这个变量,我打算:

before(() => { 
    return a('my_content'); 
    }) 

回答

1

这是因为摩卡检查你传递给before功能检查多少参数defined on it这样的:

this.async = fn && fn.length; 

如果有任何定义的参数,则该函数被认为是异步的。 (Mocha还会检查它是否返回一个承诺,但这是一个不同的测试。)如果至少定义了一个参数,那么Mocha将作为第一个参数传递一个函数,当您的回调完成其工作时,您需要调用该函数。该回调(传统上命名为done)对于不使用承诺的代码非常有用。 如果你不叫它,那么即使你答复了承诺,摩卡也会永远等待。

请注意,Mocha与所有其他挂钩相同:beforeEach,after等等,并且您将回调传递给it

+0

启蒙的解释。那太糟糕了......没有向后兼容的方式来做我的改变。好吧。谢谢! – Kev

1

摩卡before,after,it函数接受一个参数 - 回调函数。它应该被定义,并要求当你的测试使用异步功能:

db.connect是异步功能:

before(done => { 
    db.connect(done); 
} 

db.connect返回你不应该使用回调,并可能返回的承诺承诺:

before(() => { 
    return db.connect(); 
} 

在您的代码中,您可以使用a函数调用before函数,该函数接受两个参数。摩卡将第一个参数解释为回调,并试图调用它。

为了避免这个问题,你需要直接调用a功能,并通过PARAMS它:

before(() => { 
    return a(dummy, my_var); 
} 
相关问题