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

发布于 2022-09-02 20:01:25 字数 677 浏览 19 评论 0

在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')
    })
})

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

终陌 2022-09-09 20:01:26

试试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
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文