2017-05-05 81 views
1

我正在爲我工​​作的產品編寫一個執行單元測試的迷你框架。我希望儘可能無縫地發佈和管理測試數據。使用Mocha,使用After()掛鉤可以輕鬆安排測試數據清理。Javascript摩卡時間表一次測試數據清理

您可以將單個測試包裝在describe()塊中,並使用該塊的Before/After方法,但是如果可能,我寧願避免這種情況。

您可以將清理功能傳遞給afterEach,它專門針對測試中填充的數據。雖然這隻會對一次清理而言是必要的,但這樣做似乎很笨拙。

是否有可能在一次測試中生成測試數據,僅僅是爲了測試,還安排了與Mocha一起進行清理?

+0

1.您是否必須生成單獨的文件?只要您的測試數據具有可由內存管理的大小,您就可以輕鬆編寫測試數據生成功能。 2.你能否詳細說明「只需要一次清理」的含義? 'afterEach'有什麼問題? –

+0

爲了更加清楚,我的測試數據使用Knex填充到數據庫中。我希望測試能夠從助手請求數據並讓他們填充數據庫,然後清理它。因此,如果一個測試塊向表中插入兩個條目,那麼在測試運行之後,應該刪除這兩個條目。我可以使用它們的主鍵來跟蹤它們並以有針對性的方式清理它們。我可以在AfterEach之後這樣做,但它會在每次測試之後運行,而不是一次性清理。 – Akron

+0

如果你想測試讀/寫,我會建議一個模擬工具,比如優秀的['mock-knex'](https://www.npmjs.com/package/mock-knex)。或者你可以很容易地編寫你自己的模擬數據庫,它實現了你正在測試的方法並將條目存儲在內存中。 –

回答

0

當然,只是在測試本身中運行你的代和清理。如果它是異步的,則可以使用done回調使其等待,直到它被調用。

mocha.setup('bdd'); 
 
describe('suite', function() { 
 
    function getData() { 
 
    // Simulate asynchronous data generation 
 
    console.log('grabbing data'); 
 
    return new Promise((resolve, reject) => { 
 
     setTimeout(() => resolve(100), 500); 
 
    }); 
 
    } 
 

 
    function cleanup() { 
 
    // Simulate asynchronous cleanup 
 
    console.log('cleaning up...'); 
 
    return new Promise((resolve, reject) => { 
 
     setTimeout(resolve, 500); 
 
    }); 
 
    } 
 

 
    it('should do generation and clean up', function(done) { 
 
    // Generate some data 
 
    getData() 
 
     .then(data => { 
 
     // Test the data 
 
     if (data !== 100) { 
 
      throw new Error('How?!'); 
 
     } 
 

 
     console.log('test passed'); 
 

 
     // Cleanup 
 
     return cleanup(); 
 
     }) 
 
     .then(_ => { 
 
     // Use done() after all asynchronous work completes 
 
     console.log('done cleaning'); 
 
     done(); 
 
     }) 
 
     .catch(err => { 
 
     // Make sure it cleans up no matter what 
 
     cleanup().then(_ => console.error(err)); 
 
     }); 
 
    }); 
 
}); 
 
mocha.run();
<script src="https://cdn.rawgit.com/mochajs/mocha/2.2.5/mocha.js"></script> 
 
<div id="mocha"></div>

+0

這可能是最好的方法。我想避免在測試結束時明確地調用清理方法。我已經在describe()級別的測試數據中自動安排清理。開發人員可能會忘記在單個測試中明確清除它,因爲這是不同的,但這是一個很好的方法。 – Akron

+0

@Akron儘管如此,要麼指定需要清理的特定測試,要麼只是運行一般清理並希望最好。據我所知,這是關於它的結果。無論如何,你需要標記一個測試清理*以某種方式*所以總有可能有人忘記清理它。 –

0

我想測試後清理是一般問題,因爲清理一致性保證不是很強,即是清理功能保證運行?可能不會。如果不確定是否會進行清理,那麼很可能使下一次測試處於不一致的狀態。我認爲這是很好做的嘗試,但你可以通過防止故障:

  • 清理/建立DB狀態的每個測試
  • 的摧毀世界,讓每個測試具有一致的狀態之前(可以通過執行來實現您在交易環境中的測試並在每次測試後回滾交易,並且至少從未進行交易)
  • 測試創建唯一數據。通過利用獨特的數據,您還可以並行運行測試,因爲它允許多個不同的測試具有獨立的數據庫視圖。如果每個測試將自己的數據,你只需要擔心在每個測試運行

上述的開始置備整個數據庫,如果你能包住您的測試在一個事務是快如閃電, (像Django和Rails這樣的web框架可以做到這一點,而且速度非常快,並且使得測試/ db狀態非常容易推理)