首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Jasmine的spyOn / andReturn模拟fs.readFileSync()

使用Jasmine的spyOn / andReturn模拟fs.readFileSync()
EN

Stack Overflow用户
提问于 2016-08-03 14:32:58
回答 1查看 2.1K关注 0票数 1

我试图模拟fs.readFileSync()的响应,以便测试代码是否在配置文件中返回一些数据。显然,我不想测试我的配置文件的内容。

我正在尝试用(api.js)测试这段代码。

代码语言:javascript
复制
var fs = require('fs');
var config = JSON.parse(fs.readFileSync('configure.json', 'utf8'));

var Api = {
    api_key: config['api-key'],
    heartbeat_id: config['resource-id'],
};

如果我可以模拟fs.readFileSync返回的内容,那么我就可以让它返回一些测试值。我的测试如下所示:

代码语言:javascript
复制
var api = require('./api');
var fs = require('fs');

describe('Api object contains correct details', function(){
    it('Has an API key of "test API"', function(){
        spyOn(fs, 'readFileSync').andReturn(`{
            "api-key": "test API",
            "resource-id": "Resource ID"
        }`);
        expect(api.api_key).toBe("test API");
    });
});

测试失败,并返回我实际配置文件中的值。

EN

回答 1

Stack Overflow用户

发布于 2016-08-14 14:57:45

api.js中,您不会导出任何内容以供其他模块使用,因此当您在测试文件中...

代码语言:javascript
复制
var api = require('./api');

..。您将直接执行api.js文件。这意味着,当您的测试在fs.readFileSync上创建间谍时,该函数已经被api.js使用,并且您的值注入未在测试范围中使用。

实现所需功能的一种方法是在api.js中创建一个按需检索配置的函数,并将该函数封装在module.exports块中。然后,在您的测试中,请求api.js使测试为检索配置做好了准备,因此,如果您在检索之前在fs.readFileSync上创建了一个间谍,则将调用该间谍,您可以对模拟的值进行断言。

使用Jasmine 2.4.1,它看起来是这样的:

src/api.js

代码语言:javascript
复制
var fs = require('fs');

module.exports = {
    getConfig: function() {
        var config = JSON.parse(fs.readFileSync('./src/configure.json', 'utf8'));

        var Api = {
            api_key: config['api-key'],
            heartbeat_id: config['resource-id'],
        };

        return Api;
    }
}

spec/api.spec.js

代码语言:javascript
复制
var api = require('../src/api'); // fs.readFileSync hasn't been used yet
var fs = require('fs');

describe('Api object contains correct details', function(){
    it('Has an API key of "test API"', function() {
        spyOn(fs, 'readFileSync').and.returnValue(`{ // here it's being mocked
            "api-key": "test API",
            "resource-id": "Resource ID"
        }`);
        var config = api.getConfig(); // now we are using the mock
        expect(config.api_key).toBe("test API");
    });
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38736031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档