尝试存根函数会导致属性描述符不可配置且不可写

Jar*_*ede 8 javascript unit-testing node.js sinon

我正在尝试编写一个单元测试来存根@aws-sdk/s3-request-presignergetSignedUrl包中的函数,但是当我尝试使用 存根该函数时,我收到错误:sinon

  • 类型错误:属性 getSignedUrl 的描述符不可配置且不可写
const s3RequestSigner = require("@aws-sdk/s3-request-presigner");
const expect = require('chai').expect;
const sinon = require('sinon')
....
it('should throw an error when getSignedUrl rejects', async function() {
  const sandbox = sinon.createSandbox();
  sandbox.stub(s3RequestSigner, "getSignedUrl").rejects("fakeUrl");
  sandbox.restore();
})
Run Code Online (Sandbox Code Playgroud)

我正在使用 node.js 16 并编写 javascript 而不是 typescript。有没有办法模拟我的函数,否则我正在努力编写测试?

Jar*_*ede 2

所以我不会把这个作为官方的答案,除非没有更好的解决方案,但这就是我的研究带来的解决方案。

该问题与此相关:https://github.com/sinonjs/sinon/issues/2377

当 Object.descriptor 不可配置时,sinon 会抛出错误。

目前我找不到明显的解决方法。解决的方法是使用proxyquire:

const sinon = require('sinon')
const proxyquire =  require('proxyquire')
...
it('should throw an error when getSignedUrl rejects', async function() {
    const fakeurl = 'hello world'
    const fakeURL = sinon.stub().resolves(fakeurl)
    const handler = proxyquire(
      '../../handlers/presigned_url',
      {
        '@aws-sdk/s3-request-presigner': {
          'getSignedUrl': async () => {
            return fakeURL()
          }
        }
      }
    )
Run Code Online (Sandbox Code Playgroud)

然后这将解决你想要fakeurl成为的任何事情。