【问题标题】:Node, Sinon, Mocha mock default exported functionNode、Sinon、Mocha mock 默认导出函数
【发布时间】:2020-09-25 18:50:22
【问题描述】:

我正在尝试模拟导入 nodeVault 以便我可以设置读取函数的返回值。 我有以下代码:

import nodeVault from 'node-vault';

const getVaultClient = (vaultToken) => {
  return nodeVault({
    apiVersion: 'v1',
    endpoint: process.env.VAULT_URL,
    token: vaultToken.auth.client_token,
  });
}

const getCredentialsFromVault = async () => {
  const vaultToken = await getVaultToken();
  const vault = getVaultClient(vaultToken);
  const { data } = await vault.read(process.env.VAULT_SECRET_PATH);
  return { client_id: data.client_id, client_secret: data.client_secret, grant_type: 'client_credentials' };
};

然后我有一个单元测试:

describe('AttributeLoad', () => {
  let sandbox;
  let pedApiMock;
  let authApiMock;
  let vaultAuthenticateMock;
  let nodeVaultClientMock;

  beforeEach(() => {
    sandbox = createSandbox();
    process.env = {  VAULT_URL: 'testVault', VAULT_SECRET_PATH: 'testPath' };
    pedApiMock = sandbox.stub(attributeLoader.pedApi, 'post');
    authApiMock = sandbox.stub(attributeLoader.authApi, 'post');
    vaultAuthenticateMock = sandbox.stub(vaultAuthAws.prototype, 'authenticate');
    nodeVaultClientMock = sandbox.stub(nodeVault.prototype, ''); --------> Not sure what should go here 
    I have tried read and constructor
  });

  afterEach(() => {
    sandbox.restore();
  });

 it('Should call api with correct request body and correctly filter successes and rejections', async () => {
    const expectedOutput = {
      rejectedLines: [
       ....
      ],
      validLines: [
      .....
      ]
    };

    const mockAuthResponse = {
      data: {
        access_token: 'mocktoken',
      },
    };

    const mockVaultToken = {
      auth: {
        client_token: ''
      }
    };

    const expectedAuthParams = {
      client_id: '',
      client_secret: '',
      grant_type: 'client_credentials',
    };

    const mockVaultData = {
      data: {
        client_id: '',
        client_secret: '',
      }
    };

    pedApiMock.returns(Promise.resolve(mockResponse));
    authApiMock.returns(Promise.resolve(mockAuthResponse));
    vaultAuthenticateMock.returns(Promise.resolve(mockVaultToken));
    nodeVaultClientMock.returns(Promise.resolve(mockVaultData));

    const finalTestData = await attributeLoader.load(testInputData);

    assert.calledWith(authApiMock, expectedAuthParams);

    expect(finalTestData.rejectedLines).to.deep.equal(expectedOutput.rejectedLines);
    expect(finalTestData.validLines).to.deep.equal(expectedOutput.validLines);
  });

});

我尝试的一切都会出现此错误:

  • “在每个之前”钩子“应该调用具有正确请求主体的 api 并正确过滤成功和拒绝”: TypeError:无法存根不存在的属性读取* ---> 或我尝试模拟的任何函数 我也尝试过监视 nodeVault。

我们将不胜感激任何和所有的帮助

【问题讨论】:

    标签: node.js mocha.js sinon es6-modules


    【解决方案1】:

    所以经过更多挖掘后,我能够使用 proxyquire 模拟节点保险库:

    import proxyquire from 'proxyquire';
    
    const attributeLoader = proxyquire('../src/attributeLoader', { 'node-vault': () => { return { read: () => mockVaultData } } });
    
    

    然后就解决了。

    【讨论】:

      猜你喜欢
      • 2016-06-03
      • 2021-04-14
      • 2021-06-28
      • 2020-05-22
      • 1970-01-01
      • 2016-10-08
      • 2015-08-21
      • 2016-07-24
      • 2015-12-29
      相关资源
      最近更新 更多