首页 > 解决方案 > 在 sinon 存根打字稿上返回 AWSError

问题描述

我有这个功能:

export async function checkIfUserExist(user: User): Promise<boolean> {
  let result: PromiseResult<QueryOutput, AWSError>;

  const params = {
    TableName: "Users",
    IndexName: "Email-index",
    KeyConditionExpression: "Email = :user_email",
    ExpressionAttributeValues: {
      ":user_email": user.Email
    }
  }

  result = await dynamodb.query(params).promise();

  if (result.$response.error != null) {
    console.log(`Error query: ${result.$response.error}`)
    return true;
  } else if (result.Count > 0) {
    console.log(`User already exist`)
    return true;
  } else {
    return false;
  }
}

我正在尝试使用 mocha/chai 和 Sinon 来模拟它。我试图返回一个 AWSError 来测试第一条if语句。我的测试代码是这样的:

it('With error @ query', async () => {
    const errorStub = Sinon.stub(AWS.DynamoDB.DocumentClient.prototype, 'query')
    const input: User = {
      Email: "pleaseneverregisteruserwiththisemail@gmail.com"
    };
    const expectedOutput: boolean = false;
    const output = await checkIfUserExist(input);

    expect(output).to.equal(expectedOutput);
    expect(errorStub.calledOnce).true;
    Sinon.restore();
  })

如何在 errorStub 中返回 AWSError ?

标签: javascriptamazon-web-servicesunit-testingamazon-dynamodbsinon

解决方案


您需要存根dynamodb.query()具有方​​法的方法的返回值.promise()。之后,您还需要将.promise()方法的已解析值存根到AWSError.

index.ts

import AWS from 'aws-sdk';

const dynamodb = new AWS.DynamoDB.DocumentClient();

export async function checkIfUserExist(user): Promise<boolean> {
  let result;

  const params = {
    TableName: 'Users',
    IndexName: 'Email-index',
    KeyConditionExpression: 'Email = :user_email',
    ExpressionAttributeValues: {
      ':user_email': user.Email,
    },
  };

  result = await dynamodb.query(params).promise();

  if (result.$response.error != null) {
    console.log(`Error query: ${result.$response.error}`);
    return true;
  } else if (result.Count > 0) {
    console.log(`User already exist`);
    return true;
  } else {
    return false;
  }
}

index.test.ts

import AWS, { AWSError } from 'aws-sdk';
import { DocumentClient } from 'aws-sdk/clients/dynamodb';
import { expect } from 'chai';
import sinon from 'sinon';
import { checkIfUserExist } from '.';

describe('68761832', () => {
  it('With error @ query', async () => {
    const mReq = { promise: sinon.stub().resolves({ $response: { error: new Error('network') } }) };
    const queryStub = sinon
      .stub(AWS.DynamoDB.DocumentClient.prototype, 'query')
      .returns((mReq as unknown) as AWS.Request<DocumentClient.QueryOutput, AWSError>);
    const input = {
      Email: 'pleaseneverregisteruserwiththisemail@gmail.com',
    };
    const output = await checkIfUserExist(input);
    expect(output).to.equal(true);
    expect(queryStub.calledOnce).true;
    expect(mReq.promise.calledOnce).true;
    sinon.restore();
  });
});

测试结果:

  68761832
Error query: Error: network
    ✓ With error @ query


  1 passing (6ms)

----------|---------|----------|---------|---------|-------------------
File      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s 
----------|---------|----------|---------|---------|-------------------
All files |   66.67 |       25 |     100 |   66.67 |                   
 index.ts |   66.67 |       25 |     100 |   66.67 | 22-26             
----------|---------|----------|---------|---------|-------------------

推荐阅读