2016-11-17 92 views
2

我有以下的Javascript代碼:如何用Sinon.JS模擬一個回調中的模塊函數?

import Notifications from 'notification-system'; 

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

notification-system一些模塊,我NPM安裝。

我想在這個單元測試嘲笑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。 存根應該在promise .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(); 
    }); 
    }); 
}); 
相關問題