如何在我的node.js應用程序中嘲笑數據庫,在這種情況下,使用mongodb
作爲博客REST API的後端?在node.js中模擬數據庫?
當然,我可以將數據庫設置爲特定的testing
數據庫,但我仍然會保存數據,而不是僅測試我的代碼,而且還測試數據庫,所以實際上我沒有進行單元測試,而是進行集成測試。
那麼應該怎麼做?創建數據庫包裝器作爲應用程序和數據庫之間的中間層,並在測試時替換DAL?
// app.js
var express = require('express');
app = express(),
mongo = require('mongoskin'),
db = mongo.db('localhost:27017/test?auto_reconnect');
app.get('/posts/:slug', function(req, res){
db.collection('posts').findOne({slug: req.params.slug}, function (err, post) {
res.send(JSON.stringify(post), 200);
});
});
app.listen(3000);
// test.js
r = require('requestah')(3000);
describe("Does some testing", function() {
it("Fetches a blogpost by slug", function(done) {
r.get("/posts/aslug", function(res) {
expect(res.statusCode).to.equal(200);
expect(JSON.parse(res.body)["title"]).to.not.equal(null);
return done();
});
});
));
你知道,你說得很好。雖然單元測試具有驚人的目的(即隔離),但您已經爲集成測試提供了強有力的支持。 –
@MichaelPerrenoud:我喜歡christkv的回答規定的規則:**「不要嘲笑任何你不擁有的東西」**。雖然沒有詳細說明爲什麼這是一個壞主意,但要記住這是一個簡單的規則。 – slebetman
我不同意這個答案,他們在meteorjs運行測試時(我假設它不是一個模擬庫,而是一個臨時文件)以某種方式設置了一個測試數據庫,它非常方便。讓一個物體的行爲與mongodb完全一樣並在其後清理是非常有用的。無論是內存還是臨時文件都是實現細節,因此您不必重複代碼。我同意做駕駛員的人應該是製造模擬物體的人。 – Uri