【问题标题】:Return AWSError on sinon stub typescript在 sinon 存根打字稿上返回 AWSError
【发布时间】:2021-10-16 02:02:31
【问题描述】:

我有这个功能:

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?

【问题讨论】:

  • 您能否详细说明如何获得“dynamodb”变量?变量的类型是什么?它在哪里实例化?
  • @stijndepestel 变量在checkIfUserExist 函数所在文件的开头全局实例化
  • 我认为存根工作不正常,但在第二次阅读时,我发现它根本不存在。我已经添加了答案。

标签: javascript amazon-web-services unit-testing amazon-dynamodb sinon


【解决方案1】:

您已经有一个存根,所以正如您在the documentation 中看到的那样,它就像在存根上调用正确的函数一样简单:

const errorStub = Sinon.stub(AWS.DynamoDB.DocumentClient.prototype, 'query');
errorStub.throws(new AWSError());

【讨论】:

    【解决方案2】:

    您需要对具有.promise() 方法的dynamodb.query() 方法的返回值进行存根。之后,您还需要将.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             
    ----------|---------|----------|---------|---------|-------------------
    

    【讨论】:

      猜你喜欢
      • 2015-11-28
      • 2017-07-12
      • 1970-01-01
      • 2020-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-13
      • 1970-01-01
      相关资源
      最近更新 更多