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

查看:151
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆