2017-08-18 47 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); 
} 
相關問題