2015-11-20 10 views
7

Zajmuję się tworzeniem aplikacji, w której potrzebuję jakiejś abstrakcji.Abonowanie klasy za pomocą mangusty

Chodzi mi o to, że chciałbym "symulować" zachowanie w interfejsie, takie jak tworzenie umowy wewnątrz moich konkretnych zajęć.

Właściwie kontaktach z użytkownikami, mam klasę UserMongoRepository z umową projekt:

  • GETALL() zwraca pełną listę użytkowników przez obietnicę
  • getById (ID) zwraca się do zainteresowanych użytkowników przez obietnicę
  • save (użytkownik) oszczędza użytkownikowi przez obietnicę
  • ... itp

mam ten sam mnie thods zaimplementowane wewnątrz UserMysqlRepository (pozwalając mi zmienić zachowanie, gdy zmiana jest potrzebna.

Problem

Moim problemem jest to, że mam do czynienia z Mangusta, które nie działają jak DataMapper, ale raczej aktywnego rekordu.

Oznacza to, że moja realizacja Save (użytkownik) byłoby to trochę dziwne jak następuje:

save(user){ 
    let mongooseUser = this.convert(user); 
    return user.save(); 
    } 

Metoda konwersji pozwala mi przejść z standardowy model do konkretnego modelu Mongoose. To pozwala mi znowu mieć trochę abstrakcji i nie muszę przepisywać pełnego dostępu do danych aplikacji.

Moim prawdziwym problemem jest to, kiedy próbuję jednostki przetestować pełną klasę:

import MongooseUser from '../../auth/mongooseModel/MongooseUser'; 
/** 
* UserMongoRepositoryclass 
*/ 
export default class UserMongoRepository{ 

    /** 
    * Create an UserMongoRepository 
    */ 
    constructor(){ 

    } 

    /** 
    * Convert a User to a MongooseUser 
    */ 
    convert(user){ 
    return new MongooseUser({email:user.mail,password:user.password,firstname:user.firstName, lastname:user.lastName}); 
    } 

    findById(id){ 
    return MongooseUser.find({id:id}); 
    } 

    save(user){ 
    return user.save(); 
    } 

} 

w standardowy sposób, chciałbym wprowadzić mój DAO wewnątrz mojego konstruktora, a będąc w stanie go wyśmiewać.

W przypadku mangusty, jest to nieco niepokojące, ponieważ element, który sprawia, że ​​zadanie nie jest instancyjnym obiektem (tak, że mogę go wyśmiać), ale definicja klasy jest importowana na górze dokumentu.

Solutions

powinienem zdać definicję klasy MongooseUser jako parametr wewnątrz konstruktora?

co oznacza, że ​​będę miał ten kod wewnątrz metody konwersji:

let user = new this.MongooseUser({}) 

Jeżeli masz lepszy pomysł, aby abstrakcyjne zachowania mangusty w odwzorowujący dane sposób?

nie chcę użyć innego modułu, to, moim sensie, najbardziej zaawansowanej jednym z NodeJS ...

+0

celu wyjaśnienia, że ​​używasz mongoose prawo – CreasolDev

+0

Na razie Używam go, tak – mfrachet

+0

Muszę iść na bankomat, ale dam ci odpowiedź wkrótce;) – CreasolDev

Odpowiedz

0

nie jestem zaznajomiony ze składnią import (NOR EMCASCRIPT-6), chociaż można powiedzieć używasz node.js, więc polecam używanie pakietu proxquire. Chodzi o to, że pakiet pozwala wymagać pakietu zewnętrznego, jednocześnie obciążając wymagania, które będą używane przez ten pakiet.Więc w twoim przypadku, można zrobić coś takiego:

proxyquire('../my/class/that/uses/mongoose', { 
    mongoose: MyTestMongooseImplementation 
}) 

co pozwoliłoby na wykorzystanie własnego mongoose realizację jednocześnie używając MongooseUser jak zdefiniowano je w pakiecie. Alternatywnie, można po prostu zastąpić The MongooseUser klasa (ścieżki w stosunku do pliku, którego wymagania jesteś stubbing:

proxyquire('/path/to/UserMongooseRepository', { 
    '../../auth/mongooseModel/MongooseUser': MyTestMongooseUser 
}) 

Dokumentacja: https://www.npmjs.com/package/proxyquire