首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jest测试与ssh2-sftp-客户端库集成的函数。

Jest测试与ssh2-sftp-客户端库集成的函数。
EN

Stack Overflow用户
提问于 2020-11-13 23:39:53
回答 1查看 1.8K关注 0票数 0

我需要测试一个函数,它使用shh2-sftp客户端库将文件从本地路径写入到sftp机器上的远程路径。

我自己的职能如下:

代码语言:javascript
复制
 //fileshareAPI.js
 saveFile: function saveFile(folder, filename, file) {
    uploadValidateBody(folder, filename, file);
    const Client = require('ssh2-sftp-client');
    const sftp = new Client();
    return sftp.connect(sftpConfig)
    .then(() => {
        console.log('connection OK')
        fs.writeFile(filename, file, { encoding: 'base64' }, (err) => console.log(err));
        console.log(`${basePath}${folder}`)
        return sftp.mkdir(`/${basePath}${folder}`, true);
    }).then(() => {
        return sftp.put(filename, `/${basePath}${folder}/${filename}`);
    }).then(() => {
        fs.unlinkSync(filename);
        return true;
    }).catch((err) => {
        console.log('an erro occurred')
        throw new InternalServerError(5002, err.message)
    }).finally(() => {return sftp.end()})
}

我创建了我自己的测试类

代码语言:javascript
复制
const sftp = require('ssh2-sftp-client') //import of the class from the library
jest.mock('ssh2-sftp-client') //default mock. All methods are undefined
describe('test', () => {
beforeAll(() => {
    sftp.mockImplementation(() => {
        return {
            connect: jest.fn().mockReturnValue(Promise.reject(new Error('error'))),
            mkdir: jest.fn().mockReturnValue(Promise.resolve(true)),
            put: jest.fn().mockReturnValue(Promise.resolve(true)),
            end: jest.fn().mockReturnValue(Promise.resolve(true))
        }
    })
});
it('should throw exception', () => {
    return expect(fileshareUtilities.saveFile('a', 'b', 'c')).rejects.toThrow('error')
});
});

尽管通过mockImplementation方法声明了新的构造函数,但我总是得到默认模拟返回的构造函数。实际上,我得到了以下错误:

代码语言:javascript
复制
TypeError: Cannot read property 'then' of undefined

  65 |     saveFile: function saveFile(folder, filename, file) {
  66 |         uploadValidateBody(folder, filename, file);
> 67 |         return sftp.connect(sftpConfig)
     |                ^
  68 |         .then(() => {
  69 |             console.log('connection OK')
  70 |             fs.writeFile(filename, file, { encoding: 'base64' }, (err) => console.log(err));

  at Object.saveFile (lib/apis/fileshare/fileshareAPI.js:67:16)
  at Object.<anonymous> (test/fileshare.test.js:30:42)

如何为每个测试重写不同的构造函数方法,以便可以测试在saveFile中调用的函数链中的各个点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-11-14 21:39:35

我希望这对其他人有帮助,但我已经找到了解决办法。默认情况下,我总是定义模拟,然后在ssh2-sftp客户端库类的实例上调用mockImplementation()方法,模拟单个函数。对于每个测试,我重写每个函数的返回值。

这里有一个例子:

代码语言:javascript
复制
const sftp = require('ssh2-sftp-client');
const mockConnect = jest.fn();
const mockMkdir = jest.fn();
const mockPut = jest.fn();
const mockEnd = jest.fn();
const mockRename = jest.fn();
sftp.mockImplementation(() => {
  return {
    connect: mockConnect,
    mkdir: mockMkdir,
    put: mockPut,
    rename: mockRename,
    end: mockEnd
 }
});


it('test mkdir', async() => {
    mockConnect.mockReturnValue(Promise.resolve(true));
    mockMkdir.mockReturnValue(Promise.reject(new Error('permission danied mkdir')))
    await expect(fileshareUtilities.saveFile(inputFolder, inputFilename,   'file')).rejects.toThrow(new InternalServerError(5002, "permission danied mkdir"));
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64829401

复制
相关文章

相似问题

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