首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用Jest模拟所需的模块功能?

如何用Jest模拟所需的模块功能?
EN

Stack Overflow用户
提问于 2018-05-07 07:31:53
回答 2查看 5.2K关注 0票数 1

我需要测试以下代码:

createCassandraDriver

代码语言:javascript
复制
const driver = require('cassandra-driver')
module.exports = ({
  cassandra_user,
  cassandra_password,
  cassandra_address
}) => {
  return new Promise((resolve, reject) => {
    try {
      const client = new driver.Client({
        contactPoints: cassandra_address.split(','),
        authProvider: authProvider(cassandra_user, cassandra_password),
        queryconfig: {
          consistency: driver.types.consistencies.quorum
        }
      })
      return resolve(client)
    } catch (e) {
      reject(e)
    }
  })
}

我在嘲笑“司机,客户”的电话。我试着用“间谍”来做,就像这样:

代码语言:javascript
复制
'use strict';
const rewire = require('rewire'),
      driver = require('cassandra-driver'),
      createCassandraDriver = require('../../lib/createCassandraDriver.js');

const defaultArguments = () => {
  return {
    'cassandra_address': '127.0.0.1',
    'cassandra_user': 'cassandra_user',
    'cassandra_password': 'cassandra_password'
  };
}

jest.mock("cassandra-driver");

describe('Create cassandra driver tests', function () {
  describe('success flow', function () {
    it('Should pass without any errors ', async function () {    
        await createCassandraDriver(defaultArguments())
    });
  });
  afterEach(function () {
    jest.restoreAllMocks()
  });
});

模拟文件

代码语言:javascript
复制
const driver = jest.genMockFromModule('cassandra-driver');
driver.Client = function () {return "cassandra_client"}    
module.exports = driver;

但是我收到一条错误消息,上面写着‘驱动不是一个函数’,这是正确的。

那么,我怎么能嘲笑“driver.Client”的调用呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-08 07:33:22

我建议在Jest测试中使用手动莫克斯来模拟外部依赖项。

  1. __mocks__旁边创建一个名为node_modules的目录。
  2. 创建文件__mocks__/cassandra-driver.js
代码语言:javascript
复制
module.exports = {
  types: {
    consistencies: {
      quorum: null
    }
  },
  Client: jest.fn()
};
  1. 在测试文件中添加以下行:
代码语言:javascript
复制
jest.mock("cassandra-driver");

现在,每次您在测试中导入cassandra-driver或在测试中导入的任何文件中,您在步骤2中实现的模块都将被导入。

这允许您使用任何一个driver.Client调用模拟方法来替换实现、存根返回值或访问模拟实例。

下面是一个完整的测试示例:

代码语言:javascript
复制
import driver from "cassandra-driver";
import createCassandraDriver from "./createCassandraDriver";

jest.mock("cassandra-driver");

const clientStub = {
  foo: "bar"
};

driver.Client.mockImplementation(() => clientStub);

it("renders without crashing", async () => {
  const result = await createCassandraDriver({
    cassandra_user: "foo",
    cassandra_password: "bar",
    cassandra_address: "baz"
  });

  expect(result).toEqual(clientStub);
});
票数 2
EN

Stack Overflow用户

发布于 2018-05-07 12:15:09

您只能使用jest.spyOn监视对象的方法--在这里,drivercreateCassandraDriver模块中的一个私有变量,所以我们不能使用它。

看起来你使用的是重线包装__set__吗?如果是这样的话,我认为您应该能够通过使用jest.fn实现您想要的结果。

代码语言:javascript
复制
let createCassandraDriverSpy = jest.fn(clientMock);
createCassandraDriver.__set__('driver', createCassandraDriverSpy)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50209154

复制
相关文章

相似问题

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