2016-11-17 90 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(); 
    }); 
    }); 
}); 
相关问题