js单元测试的模块依赖问题

oraaange
  • 44

在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')
    })
})
回复
阅读 2.7k
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
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏