2011-09-25 94 views
15

我想爲我的Node應用的部分編寫單元測試。我爲我的ORM使用了Mongoose。測試Mongoose Node.JS應用

我已經搜索了一堆如何做與貓鼬和節點測試,但沒有帶任何東西。這些解決方案/框架似乎都是全面的,或者沒有提到嘲諷的東西。

有沒有一種方法可以模擬我的Mongoose數據庫,這樣我就可以在我的測試中返回靜態數據?我寧願不必爲每個單元測試設置測試數據庫並填寫數據。

有沒有其他人遇到過這個?

回答

6

我通過構建一些代碼解決了這個問題。我將所有與貓鼬相關的東西放在單獨的類中,並使用「保存」,「查找」,「刪除」等API,並且沒有其他類直接訪問數據庫。然後,我簡單地嘲笑那些依賴數據的測試。

我做了與返回的實際對象類似的東西。對於我在貓鼬中使用的每個模型,我都有一個相應的類來包裝它,併爲字段提供訪問方法。那些也很容易被嘲笑。

+11

您是否有這樣的代碼示例? – bouncingHippo

8

我也去找答案,並最終在這裏。這是我所做的:

我開始使用mockery來模擬我的模型所在的模塊。然後創建我自己的模擬模塊,每個模型都將它作爲屬性掛起。這些屬性包裝了真正的模型(以便測試中的代碼存在子屬性)。然後我重寫我想爲測試操作的方法,比如保存。這具有嘲笑能夠消除嘲笑的優點。

但是......

我真的不關心不夠有關撤消嘲諷編寫每個模型的包裝性能。所以現在我只需要我的模塊並覆蓋我想要操作的函數。如果它成爲問題,我可能會在單獨的進程中運行測試。

在我的測試中安排部分:

// mock out database saves 
var db = require("../../schema"); 
db.Model1.prototype.save = function(callback) { 
    console.log("in the mock"); 
    callback(); 
}; 
db.Model2.prototype.save = function(callback) { 
    console.log("in the mock"); 
    callback("mock staged an error for testing purposes"); 
}; 
+0

你是否使用NodeJS做到這一點? – bouncingHippo

+0

'schema.js'中有什麼? – Michelle

+0

@Michelle最有可能的貓鼬綱要定義 – sshow

6

另外值得一提的是:
mockgoose - 在內存中的DB嘲笑貓鼬,用於測試目的。
monckoose - 類似的,但採取了不同的方法(實現一個假的驅動程序)。 Monckoose似乎在2015年3月未發佈。

+0

你的第二個鏈接已經死了,它似乎已經被取消發佈。 –

+0

@KevinB謝謝,更新 –