2016-03-19 17 views
0

Bu senaryoyu doğru şekilde nasıl ekleyeceğimi bulmaya çalışıyorum ama biraz sıkışmış durumdayım.Bir kurucudaki stubbing değişkenleri?

Bu senaryoda, içinde couchdb veritabanlarının bir listesi olan bir db.js dosya var (her veritabanı belirli bir yıl için tweet girdileri içerir).

Her yıl yeni bir veritabanı oluşturulur ve bu yılın yeni girişlerini tutmak için bu listeye eklenir (bu nedenle veritabanlarının listesi sabit değildir, her yıl değişir). yöntemleri gibi görünür eklenmeden önce,

var nano = require('nano')(`http://${host}`); 

var databaseList = { 
    db1: nano.use('db2012'), 
    db2: nano.use('db2013'), 
    db4: nano.use('db2014'), 
    db5: nano.use('db2015'), 
    db6: nano.use('db2016') 
}; 

module.exports.connection = nano; 
module.exports.databaseList = databaseList; 

Ve event.js (basit bir model dosyası):

Yani benim db.js dosya şuna benzer

Sorum şu
var lastInObject = require('../../helpers/last_in_object'); 

var db = require('../../db'); 

var EventModel = function EventModel() { 
    this.connection = db.connection; 
    this.databaseList = db.databaseList; 
    this.defaultDatabase = lastInObject(db.databaseList); 
}; 

EventModel.prototype.findAll = 
function findAll(db, callback) {/* ... */} 

, nasıl yapmak databaseList saplaması, bu nedenle, databaseList nesnesinin büyüsünden herhangi bir kırılganlık olmadan model yöntemlerinin her birini güvenle test edebilirim?

İdeal olarak, testlerimde databaseList'in içeriklerini kaçırmak, farklı senaryolarla uğraşmak isterdim, ama nasıl başa çıkacağından emin değilim. İşte

defaultDatabase özelliği her zaman en son bilinen olaya işaret sağlamak için, bir örnek testi, ama belli ki databaseList değişiklikler o testleri yapar gibi zaman ben her yıl bu testi güncellemek zorunda kalmak istemiyoruz çok kırılgan.

it('should set the default database to the last known event',() => { 
    var Event = require('../event'); 
    var newEventModel = new Event(); 

    expect(newEventModel.defaultDatabase.config.db) 
     .to.equal('db2014'); 
}); 

Öneriler hoş geldiniz! Eğer bu yanlışlıktan geçersem, ne yaptığımı ve nasıl yaklaşabileceğimi bana bildirin!

Ayrıca, bu sadece bir senaryodur, lastInObject için testlerim var, ilgili verilerle nasıl başa çıkılacağıyla ilgileniyorum.

cevap

1

Benim düşünceme göre, tüm "db" modülünü yerleştirmelisiniz. Böylece gerçek bir db bağlantınız olmaz ve testlerinizin ortamını kolayca kontrol edebilirsiniz. Bunu, mockery modülünü kullanarak başarabilirsiniz.

Bu şekilde, require('../../db') döndürdüğü nesneyi geri gönderebilirsiniz. Bu, istediğiniz nesnenin özelliklerinde istediğiniz değeri ayarlamanıza olanak tanır.

+0

Çok iyi not! Aslında çalışmak için alay konusu olmak için uğraşıyordum ama etrafta arama yaptıktan sonra proxyquire alayla çok benziyor ve şimdi test çalışmamı aldım! Teşekkürler @jahnestacado! :) – Scotty

0

Scotty'nin yorumunu kabul edilen cevapta biraz dayandırmak ... işte yaptığım bazı kodlar var. Bunun iyi bir uygulama olduğunu garanti etmez, ancak insert ve get yöntemlerini başarılı bir şekilde uygular. Umarım birilerine yardım eder. :)

// /src/common/database.js 
const database = require('nano')('http://127.0.0.1/database'); 

module.exports = { 

    async write(document, documentId) { 
    return await new Promise(resolve => database.insert(document, documentId, resolve)); 
    }, 

    async read(documentId){ 
    return await new Promise(resolve => database.get(documentId, resolve)); 
    } 

}; 

// /test/setup.js 
const proxyquire = require('proxyquire'); 

proxyquire('../src/common/database.js', { 
    nano() { 
    return { 
     insert(document, documentId, callback){ callback(); }, 
     get(documentId, callback){ callback(); } 
    }; 
    } 
}); 
İlgili konular