2017-06-19 42 views
0

我有多個使用共享基礎文件(稱爲testBase.js)的Mocha測試文件。它負責建立所有的存根和間諜。具有多個摩卡測試文件的Sinon

如果我運行通過摩卡個人文件中的所有測試用例通過但當它貫穿摩卡測試* .js文件,測試案例開始出現故障,提高錯誤

TypeError: Attempted to wrap send which is already wrapped 

這裏是我的beforeEach和afterEach塊

beforeEach(function (done) { 
    context.alexaSpy = sinon.spy(alexa, "send"); 
} 

beforeEach(function (done) { 
    context.alexaSpy.restore(); 
} 

我實際上在兩個塊中打印出日誌,並且發現了一件奇怪的事情。我看到這樣的日誌

-- BeforeEach Fired Test1 
-- BeforeEach Fired Test1 
-- AfterEach Fired Test1 
-- AfterEach Fired Test1 

我不知道爲什麼它調用兩次,它的問題的根本原因。一次摩卡測試時,BefireEach不能撥打兩次電話。

是否在導入多個文件之前調用兩次?有人可以提出任何可能的解決方案嗎?我也嘗試sinon.sandbox,但它不起作用

+1

是'beforeEach'和'afterEach'位於* testBase *文件的根目錄?或者他們被封裝在一個函數中並以某種方式導出?請提供更多信息。 – vsenko

+0

這兩個函數都位於基本文件中,它們在testInit函數中,然後導出到測試用例 –

+0

您需要導出純函數 - 未包含beforeEach和afterEach。然後將它們傳遞到beforeEach和afterEach中的每個文件的描述塊中。否則,你會有錯誤,因爲它們都適用於外部(全局)範圍。我在我的答案的底部描述了這一點 – oligofren

回答

0

我們需要了解您在基礎文件中的確定方式。

我的猜測很簡單,就是你需要從多個文件中獲取文件,每次你做這些時,你都要添加setup和teardown函數。發生這種情況是因爲所有測試共享相同的外部範圍。要求Base文件十次將會添加beforeEach十次。

正確的做法是使用sinon.sandbox或sinon-test。更容易避免一個測試干擾下一個測試。

但是不管你做什麼,你就需要導出的功能和運行在beforeEach在每個文件

通常這樣

const base = require('./base') 

describe('module one',()=> { 
    beforeEach(base.commonStubs); 

    it('should.... ',..); 
})