2016-11-17 12 views
2

У меня есть следующий Javascript код:Как издеваться над функцией модуля внутри обратного вызова с Sinon.JS?

import Notifications from 'notification-system'; 

export class DocumentParameters { 
    handleUpload() { 
    return Promise.resolve().then(() => { 
     Notifications.success(); 
    }); 
    } 
} 

notification-system некоторая модуль я установил с НПМ.

Я хотел бы издеваться Notifications.success в этом единичном испытании:

import Notifications from 'notification-system'; 
import { expect } from 'chai'; 
import sinon from 'sinon'; 
import { DocumentParameters } from './document'; 

describe('handleUpload()',() => { 
    it('should upload and create a success notification', (done) => { 
    const success = sinon.stub(Notifications, 'success'); 
    const documentParameters = new DocumentParameters(); 

    documentParameters.handleUpload().then(() => { 
     expect(success.callCount).to.equal(1); 
     done(); 
    }); 

    success.restore(); 
    }); 
}); 

Этот тест блок не потому, что заглушка никогда не называют: success.callCount 0.

Мое решение:

import Notifications from 'notification-system'; 

export class DocumentParameters { 
    handleUpload() { 
    const success = Notifications.success; 
    return Promise.resolve().then(() => { 
     success(); 
    }); 
    } 
} 

Таким образом, заглушка работает вне обратного вызова, но не внутри. Тем не менее, мне сказали, что это плохая практика, чтобы обновить исходный код, чтобы получить тестовое тестирование.

Знаете ли вы решение, которое не подразумевает изменение исходного кода?

ответ

0

Поскольку кто-то upvoted мой вопрос:

Проблема здесь в том, что я восстанавливаю окурок success слишком быстро. Заглушка должна быть восстановлена ​​внутри обещания. Then().

Следующий код будет работать:

import Notifications from 'notification-system'; 
import { expect } from 'chai'; 
import sinon from 'sinon'; 
import { DocumentParameters } from './document'; 

describe('handleUpload()',() => { 
    it('should upload and create a success notification', (done) => { 
    const success = sinon.stub(Notifications, 'success'); 
    const documentParameters = new DocumentParameters(); 

    documentParameters.handleUpload().then(() => { 
     expect(success.callCount).to.equal(1); 
     success.restore(); 
     done(); 
    }); 
    }); 
});