"लापता क्षेत्र में config" के प्रयास के बाद नकली SecretsManager के साथ मज़ाक

0

सवाल

मैं वर्तमान में हूँ के प्रयास में नकली एडब्ल्यूएस SecretsManager के लिए मेरी यूनिट परीक्षण के साथ मज़ाक है, और हर मैं कर रहा हूँ के साथ मारा ConfigError मेरे कोड कुछ इस तरह

//index.ts
import SM from "aws-sdk/clients/secretsmanager"
const secretManagerClient = new SM()
...
export const randomMethod = async (a: string, b: string) => {
  let secret
  const personalToken = {
    SecretId: process.env.secretId,
  }
  secretManagerClient
    .getSecretValue(personalToken, (err, data) => {
      if (err) {
        console.error(`[SECRETS MANAGER] Error fetching personal token : ${err}`)
      } else if (data && data.SecretString) {
        secret = data.SecretString
      }
    })
}

मेरे मॉक इस तरह चला जाता है :

//index.test.js
const mockGetSecretValue = jest.fn((SecretId) => {
  switch (SecretId) {
    case process.env.GITHUB_PERSONAL_TOKEN:
      return {
        SecretString: process.env.GITHUB_PERSONAL_TOKEN_VALUE,
      }
    default:
      throw Error("secret not found")
  }
})

jest.mock("aws-sdk/clients/secretsmanager", () => {
  return jest.fn(() => {
    return {
      getSecretValue: jest.fn(({ SecretId }) => {
        return mockGetSecretValue(SecretId)
      }),
      promise: jest.fn(),
    }
  })
})

हालांकि, मैं इस त्रुटि मिलती है मुझ पर फेंक दिया : ConfigError: Missing region in configहै , जो मैं समझ में कुछ हद तक, लेकिन मुझे समझ नहीं आता क्यों यह तब होता है में यहाँ मजाक हिस्सा...

अग्रिम में धन्यवाद!

संपादित करें: के लिए धन्यवाद 1 जवाब है, मैं कामयाब होने से रोकने के लिए इस त्रुटि है । हालांकि, getSecretValue() विधि नहीं लौटने गुप्त मूल्य मैं करना चाहते हैं.

aws-sdk jestjs mocking node.js
2021-11-15 16:00:57
2
0

आप का उपयोग नहीं करना चाहिए कॉलबैक के .getSecretValue() विधि के साथ .promise() एक साथ. बस उनमें से एक का चयन. त्रुटि मतलब है कि आप नहीं था नकली secretsmanager वर्ग के सही ढंग से aws-sdk.

ई. जी.

index.ts:

import SM from 'aws-sdk/clients/secretsmanager';
const secretManagerClient = new SM();

export const randomMethod = async () => {
  const personalToken = {
    SecretId: process.env.secretId || '',
  };
  try {
    const data = await secretManagerClient.getSecretValue(personalToken).promise();
    return data.SecretString;
  } catch (err) {
    console.error(`[SECRETS MANAGER] Error fetching personal token : ${err}`);
  }
};

index.test.ts:

import { randomMethod } from '.';
import SM from 'aws-sdk/clients/secretsmanager';
import { mocked } from 'ts-jest/utils';
import { PromiseResult } from 'aws-sdk/lib/request';

jest.mock('aws-sdk/clients/secretsmanager', () => {
  const mSecretManagerClient = {
    getSecretValue: jest.fn().mockReturnThis(),
    promise: jest.fn(),
  };
  return jest.fn(() => mSecretManagerClient);
});

describe('69977310', () => {
  test('should get secret value', async () => {
    process.env.secretId = 's1';
    const mSecretManagerClient = mocked<InstanceType<typeof SM>>(new SM());
    const mGetSecretValueRequest = mocked(mSecretManagerClient.getSecretValue());

    mGetSecretValueRequest.promise.mockResolvedValue({
      SecretString: JSON.stringify({ password: '123456' }),
    } as PromiseResult<any, any>);
    const actual = await randomMethod();
    expect(actual).toEqual(JSON.stringify({ password: '123456' }));
    expect(mSecretManagerClient.getSecretValue as jest.Mocked<any>).toBeCalledWith({ SecretId: 's1' });
  });

  test('should throw error', async () => {
    process.env.secretId = 's1';
    const logSpy = jest.spyOn(console, 'error').mockImplementation(() => 'suppress error log for testing');
    const mSecretManagerClient = mocked<InstanceType<typeof SM>>(new SM());
    const mGetSecretValueRequest = mocked(mSecretManagerClient.getSecretValue());

    const mError = new Error('network');
    mGetSecretValueRequest.promise.mockRejectedValue(mError);
    await randomMethod();
    expect(logSpy).toBeCalledWith(`[SECRETS MANAGER] Error fetching personal token : ${mError}`);
    expect(mSecretManagerClient.getSecretValue as jest.Mocked<any>).toBeCalledWith({ SecretId: 's1' });
  });
});

टेस्ट परिणाम:

 PASS  examples/69977310/index.test.ts (7.722 s)
  69977310
    ✓ should get secret value (4 ms)
    ✓ should throw error (1 ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |     100 |       50 |     100 |     100 |                   
 index.ts |     100 |       50 |     100 |     100 | 6                 
----------|---------|----------|---------|---------|-------------------
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        8.282 s, estimated 10 s

पैकेज संस्करण:

"aws-sdk": "^2.875.0",
"typescript": "^4.1.2",
"jest": "^26.6.3",
2021-11-16 09:29:00

अपने जवाब के लिए धन्यवाद, और आप सही कर रहे हैं, मैं पढ़ने में भूलना एडब्ल्यूएस एसडीके प्रलेखन. हालांकि, मैं संघर्ष कर रहा हूँ बनाने के लिए यह काम करते हैं. अधिक संदर्भ के लिए, मैं कर रहा हूँ वर्तमान में इकाई परीक्षण एक लैम्ब्डा का उपयोग करता है कि randomMethod(), और मैं कोशिश कर रहा हूँ करने के लिए लिंक है कि विधि के लिए इस मज़ाक उड़ाया SecretsManager उदाहरण है, और नहीं होने के बावजूद विन्यास त्रुटि अब और नहीं, के getSecretValue() नहीं लौटने गुप्त मैं करना चाहते हैं. मैं अद्यतन कोड से ऊपर है.
Fares
0

मैं इस तथ्य की अनदेखी है कि मैं का उपयोग कर रहा था एक कॉलबैक आदेश में करने के लिए बाईपास promise().

निम्नलिखित सही कोड:

const mockGetSecretValue = jest.fn((SecretId, callback) => {
  console.log("secretId", SecretId)
  switch (SecretId) {
    case process.env.GITHUB_PERSONAL_TOKEN:
      const data = {
        SecretString: process.env.GITHUB_PERSONAL_TOKEN_VALUE,
      }
      callback(null, data)
      break;
    default:
      const err = new Error("secret not found")
      throw err
  }
})

jest.mock("aws-sdk/clients/secretsmanager", () => {
  return jest.fn(() => {
    return {
      promise: jest.fn(),
      getSecretValue: jest.fn(({ SecretId }, callback) => {
        return mockGetSecretValue(SecretId, callback)
      }),
    }
  })
})

एक बार फिर धन्यवाद आपकी मदद के लिए @slideshowp2!

2021-11-16 14:24:07

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में