2012-10-10 10 views
12

Utworzono otokę bazy danych dla mojej aplikacji, pokazaną poniżej. Aby to przetestować, oczywiście chciałbym zastąpić rzeczywistą bibliotekę bazy danych. Mógłbym stworzyć nową klasę, która kpi z metody query i przechwycić wszystkie dane wejściowe, ale użycie sinon.js wydaje się bardziej odpowiednie, ale w jaki sposób mogę z niej skorzystać?
Czy powinienem używać funkcji lub stub z sinon.js?Skradanie się i kpiny z klasy w sinon.js?

wrapper = (function() { 

    function wrapper() {} 

    wrapper.db = require("database"); 

    wrapper.prototype.insertUser = function(doc) { 
    return this.db.query("INSERT INTO USERS..."); 
    }; 

    return wrapper; 

})(); 

Odpowiedz

6

Możesz użyć obu do tego.

Mock mają oczekiwane uporządkowane zachowanie, które, jeśli nie zostanie wykonane prawidłowo, spowoduje błąd.

A Stub jest podobny do fałszywek, ale bez zamówienia, dzięki czemu można wywoływać swoje metody tak, jak chcesz. Z mojego doświadczenia prawie nigdy nie trzeba próbować.

Obie metody zastąpią metodę pustą lub zamknięcie, jeśli ją zdasz. Byłoby coś takiego:

stub = sinon.stub(wrapper , 'insertUser ', function() { return true; }); 

Następnie dodać oczekiwać zachowanie aby sprawdzić, czy nie stało.

Lubię używać Jasmine z Jasmine-Sinon do sprawdzania testów.

+0

Oh. Więc byłoby lepiej użyć metody 'insertUser' zamiast wywołania' this.db', ​​które wykonuje 'insertUser'? – Industrial

+2

Zależy od tego, co testujesz, ale jeśli chcesz przetestować, czy insertUser wstawia do DB, który byłby testem integracyjnym, i że nie będzie żadnego koduowania, który pozwoli ci uniknąć użycia prawdziwej logiki, z niektórymi w pamięci DB, aby "podrobić" Oracle na przykład, jeśli chcesz przetestować, czy wywołanie metody insertUser jest potrzebne, wówczas może to być metoda kodująca metodę insertUser ... –

8

Po pierwsze, chciałbym zmodyfikować definicję klasy nieco (nazwa wielka klasa i rozwiązać zadanie db):

var Wrapper = (function() { 

    function Wrapper() { 
    this.db = require("database"); 
    } 

    Wrapper.prototype.insertUser = function(doc) { 
    return this.db.query("INSERT INTO USERS..."); 
    }; 

    return Wrapper; 

})(); 

stub całą klasę:

var WrapperStub = sinon.spy(function() { 
    return sinon.createStubInstance(Wrapper); 
}); 

sinon.createStubInstance utworzy instancję Wrapper, gdzie każda metoda jest skrótem. sinon.spy pozwoli nam śledzić instancję klasy.

Więc można wykonywać go tak:

// verify instantiation 
var wrapper = new WrapperStub(); 
expect(WrapperStub).to.have.been.calledWithNew; 

// verify method stub 
wrapper.insertUser.returns('data'); 
expect(wrapper.insertUser()).to.equal('data'); 
expect(wrapper.insertUser).to.have.been.calledOnce; 

(twierdzenia używać chai i sinon-chai)

powiedziałem tylko „wykonywać go”, ponieważ ten fragment kodu nie jest rzeczywiste testy jednostkowe. Wywoływanie i wywoływanie metod będzie wykonywane przez testowany przedmiot.

Teraz, jeśli chcesz, aby drwić zależność wstrzykiwany przez require() -such jak db = require('database') w Twoim Przykładzie, można wypróbować narzędzie do testowania jak obu Jest (ale nie przy użyciu Sinon) lub sinonquire które stworzyłem zainspirowany Jest to, ale można go używać z sinonem i ulubionym narzędziem do testowania (moja koperta to mocha). Wewnętrznie, sinonquire używa tej samej techniki, jak powyżej, łącząc sinon.spy i sinon.createStubInstance, aby odgadnąć klasę.

+0

Zaktualizowane linki do Jest: https://facebook.github.io/jest/docs/mock -functions.html http://facebook.github.io/jest/docs/jest-object.html#jestenableautomock – jwadsack

Powiązane problemy