javascript - js单元测试的模块依赖问题
本文介绍了javascript - js单元测试的模块依赖问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
在js中,a模块依赖b模块运行产生的数据(通过import引入b模块,a模块是一堆函数的集合,不包含数据)
我在单独测试a模块时,如何制造一个mock的b模块数据给a模块同时不改变a模块的代码
(貌似java是有这种测试框架的?就是能用mock模块替代依赖模块?)
目前单元测试用的是mocha+karma,webpack转译es6语法
样例代码
a.js
import b from './b'
export function search(id) {
for(let i in b.data) {
if(b.data[i].id === id) {
return b.data[i].value
}
}
return -1
}
a.test.js
import { expect } from 'chai'
import { search } from '../src/a'
describe('search Test', function() {
it('search certain id return its value' , function() {
expect(search(1)).to.equal('value of 1')
})
})
解决方案
试试sinon呗,按你的需求:
var sinon = require('sinon');
//假设你有模块b,b里有个方法sayHi
var b = {
sayHi: function() {
return new Date();
}
};
//正常情况下,b.sayHi()应该输出当前日期
console.log(b.sayHi()); //the reay date
//我们现在来模拟b模块的sayHi方法,让她永远返回999
var mockB = sinon.stub(b, 'sayHi', function() {
return 999;
});
//再来调用b.sayHi()试试?
console.log(b.sayHi());//变成999了哦!!!
补充:
我假设你的b.js
是如下结构:
export default {
data: [{
id: 123,
value: 'fuck'
}]
};
现在来补一下test:
import sinon from 'sinon';
import b from './b';
import {search} from './a';
var mockB = sinon.sandbox.create().stub(b, 'data', [{
id: 1,
value: 'Hello'
}]);
//这个时候,因为b对象被sanbox替换了,于是当search(1)的时候,没有出现-1,而是Hello
console.log(search(1)); //Hello
这篇关于javascript - js单元测试的模块依赖问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文