nodejs:测试单独通过,一起运行时失败mocha、sinon、aws-sdk

如何解决nodejs:测试单独通过,一起运行时失败mocha、sinon、aws-sdk

我有以下测试:

  1. 在 VS Code 中一起运行时通过
  2. 在 CLI 上一起运行时失败
  3. 单独运行时通过(例如mocha bogus.test.js -g "second"

这是我能做到的最简单的代码(而且它非常简单):

const AWS = require("aws-sdk")
const SQS = new AWS.SQS()

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

和测试:

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",'Should have called deleteMessage once')
    })
  })
})

结果:

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

我会很高兴发现我正在做一些愚蠢的事情......

解决方法

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

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

您通过·sinon.restore()·清除了stub的调用信息,所以第二个测试用例的·stub.callCount·为0

解决方案:清除./bogus钩子内beforeEach()的模块缓存

例如

bogus.js

const AWS = require('aws-sdk');
const SQS = new AWS.SQS();

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

bogus.test.js

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','Should have called deleteMessage once');
    });
  });
});

单元测试结果:

  Bogus Test
    ✓ is the first test
    ✓ is the second test


  2 passing (9ms)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?