首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nodejs:测试单独通过,在一起运行时失败(mocha,sinon,aws)

nodejs:测试单独通过,在一起运行时失败(mocha,sinon,aws)
EN

Stack Overflow用户
提问于 2021-03-19 21:05:55
回答 1查看 526关注 0票数 3

我有测试表明:

当在VS代码中一起运行

  1. PASS时,当在CLI
  2. 上一起运行时失败,当单独运行时(例如,

下面的代码是我所能做的最基本的代码(而且它非常粗糙):

代码语言:javascript
复制
const AWS = require("aws-sdk")
const SQS = new AWS.SQS()

exports.handler = () => {
  return SQS.deleteMessage({foo: "bar"}).promise()
}

而测试:

代码语言:javascript
复制
const sinon = require("sinon")
const expect = require("chai").expect
const AWS = require("aws-sdk")

describe("Bogus Test", () => {
  let sandbox, deleteMessageStub

  beforeEach(() => {
    sandbox = sinon.createSandbox()

    deleteMessageStub = sandbox.fake.returns({ promise: () => Promise.resolve({}) })
    sandbox.stub(AWS, 'SQS').returns({
      deleteMessage: deleteMessageStub
    })  
  })

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

  it("is the first test", () => {
    const bogus = require("../bogus")
    return bogus.handler().then(() => {
      expect(deleteMessageStub.callCount).to.equal(1, 'Should have called deleteMessage once')
    })
  })

  it("is the second test", () => {
    const bogus = require("../bogus")
    return bogus.handler().then(() => {
      expect(deleteMessageStub.callCount).to.equal(1, 'Should have called deleteMessage once')
    })
  })
})

结果:

代码语言:javascript
复制
Bogus Test
✓ is the first test
1) is the second test


1 passing (14ms)
1 failing

1) Bogus Test
is the second test:

Should have called deleteMessage once
+ expected - actual

-0
+1

at ... bogus.test.js:29:46

我很高兴知道我在做些蠢事.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-03-22 02:37:02

require模块多次,模块作用域的代码将只执行一次,因为模块被缓存在require.cache对象中。

这意味着./bogus模块只加载一次,并在第二个require期间从require.cache对象获得。const SQS = new AWS.SQS();语句只执行一次。

您通过sinon.restore()清除了存根的调用信息,因此第二个测试用例的stub.callCount0

解决方案:清除 beforeEach() hook的模块缓存

例如。

bogus.js

代码语言:javascript
复制
const AWS = require('aws-sdk');
const SQS = new AWS.SQS();

exports.handler = () => {
  return SQS.deleteMessage({ foo: 'bar' }).promise();
};

bogus.test.js

代码语言:javascript
复制
const sinon = require('sinon');
const expect = require('chai').expect;
const AWS = require('aws-sdk');

describe('Bogus Test', () => {
  let sandbox, deleteMessageStub;

  beforeEach(() => {
    sandbox = sinon.createSandbox();

    deleteMessageStub = sandbox.fake.returns({ promise: () => Promise.resolve({}) });
    sandbox.stub(AWS, 'SQS').returns({
      deleteMessage: deleteMessageStub,
    });
    delete require.cache[require.resolve('./bogus')];
  });

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

  it('is the first test', () => {
    const bogus = require('./bogus');
    return bogus.handler().then(() => {
      expect(deleteMessageStub.callCount).to.equal(1, 'Should have called deleteMessage once');
    });
  });

  it('is the second test', () => {
    const bogus = require('./bogus');
    return bogus.handler().then(() => {
      expect(deleteMessageStub.callCount).to.equal(1, 'Should have called deleteMessage once');
    });
  });
});

单元测试结果:

代码语言:javascript
复制
  Bogus Test
    ✓ is the first test
    ✓ is the second test


  2 passing (9ms)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66715598

复制
相关文章

相似问题

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