mocha、sinon 和存根窗口对象

den*_*icz 1 mocha.js sinon webpack aws-sdk

我有一个 ES6 模块,我正在尝试为其编写测试,用于前端 React/Redux 应用程序。

这是在我的测试中困扰我的模块部分:

import 'aws-sdk/dist/aws-sdk';
import Bluebird from 'bluebird';

const AWS = window.AWS;
Run Code Online (Sandbox Code Playgroud)

这是我的测试的开始:

import chai from 'chai';
import { expect } from 'chai';
import chaiAsPromised from 'chai-as-promised';
import sinon from 'sinon';

chai.use(chaiAsPromised);

describe("S3Gateway", () => {
  let awsStub;
  let sandbox;
  let writeObject;

  beforeEach(() => {
    sandbox = sinon.sandbox.create();
    writeObject = require('../../../app/lib/aws/s3gateway').writeObject;

    awsStub = sinon.stub().returns({
      S3: sinon.stub().returns({
        putObject: sinon.spy()
      })
    });
    sandbox.stub(window, 'AWS', awsStub);
  });
Run Code Online (Sandbox Code Playgroud)

我在终端窗口中运行 mocha 时不断出现在标准输出中的错误是:

$ mocha test/lib/aws/s3gateway.js --compilers js:babel-core/register


  S3Gateway
    1) "before each" hook for "should attempt to write json object to s3"


  0 passing (483ms)
  1 failing

  1) S3Gateway "before each" hook for "should attempt to write json object to s3":
     ReferenceError: window is not defined
Run Code Online (Sandbox Code Playgroud)

AWS必须从对象获取的原因window是 webpack 为前端应用程序捆绑 aws-sdk 的方式。还有其他人遇到这个问题并解决它吗?

Nic*_*ole 6

mocha 测试在 Node.js 中运行,而 Node.js 没有全局 window 变量。但您可以在测试中轻松创建一个:

global.window = {};
Run Code Online (Sandbox Code Playgroud)

您甚至可以立即在其中填写您想要在测试中使用的内容:

global.window = {AWS: /* insert your test data here*/ }
Run Code Online (Sandbox Code Playgroud)

应该可以。

如果您需要更真实的窗口,您应该考虑使用 jsdom。