我如何使用sinon对非对象函数进行存根

问题描述 投票:1回答:2

我有一个非对象函数

在getConfig.js上

export default function () {
 /** do something **/
  return {
    appConfig: { status: true } 
    }
}

并且在我的主文件下

import getConfig from './getConfig';

export default function() {
 const { appConfig } = getConfig();
 
 if(appConfig.status) {
   console.log("do the right thing");
   else {
   console.log("do other things")
   }
  }
 }

如何使用sinon存根或模拟方法模拟getConfig函数?还是有更好的方法将appConfig.status属性设置为true或false?

我想执行以下操作,但不起作用

import getConfig from './getConfig';
import main from './main';

test('should status to be true', () => {
  
  sinon.stub(getConfig).callsFake(sinon.fake.returns({status:true});
  expect(main()).toBe('to do the right thing')
}
javascript unit-testing sinon
2个回答
1
投票
getConfig函数仅返回一个对象,因此您只需要检查返回的值(该对象。)根本不需要sinon。您需要做的是声明返回值。您可以使用mocha测试运行程序来运行测试,并可以使用断言工具(例如节点的内部mocha模块进行断言)。

“是否有更好的方法将appConfig.status属性设置为true或false?”如何在函数中添加参数?

assert

测试(有关设置环境,请参见// using default values for properties
export default function(status = true) {
  // no need for additional `appConfig` property
  return { status };
}
手册):

mocha


0
投票
好吧,我只是用JEST找到了另一个替代解决方案

import getConfig from './getConfig'; import assert from 'assert'; describe('getConfig', function() { it('should return { status: true } by default', function() { const ret = getConfig(); assert.deepEqual(ret, { status: true }); }); it('should return { status: false } by passing `false`', function() { const ret = getConfig(false); assert.deepEqual(ret, { status: false }); }); });
所以解决方案看起来像

jest.mock('./getConfig', () => ( jest.fn() .mockReturnValueOnce({ appConfig: { status: true }}) .mockReturnValueOnce({ appConfig: { status: false }}) )) //The getConfig get replaced with the above mock function
© www.soinside.com 2019 - 2024. All rights reserved.