在mocha / chai设置中,我试图将babel-plugin-rewire与sinon结合使用以测试和测试同一模块中的功能。这些是下面的示例文件:

首先,一个使用sinon和babel-plugin-rewire的index.js和测试文件。重新布线是可行的,但是由于某些原因,我的存根不起作用。应用到该函数的函数从不存根,仅返回原始值:

// index.js

function foo() {
  return "foo";
}

export function bar() {
  return foo();
}

export function jar() {
  return "jar";
}

//index.test.js

import chai from "chai";
import sinon from "sinon";
import * as index from "./index";
const expect = chai.expect;

const sandbox = sinon.sandbox.create();

describe("babel-plugin-rewire", () => {
  it("should be able to rewire", () => {
    index.default.__set__("foo", () => {
      return "rewired"; // successfullly rewires
    });
    expect(index.bar()).to.equal("rewired"); // works fine
    index.default.__ResetDependency__("foo");
    expect(index.bar()).to.equal("bar"); // works fine
  });
});

describe("sinon", () => {
  afterEach(() => {
    sandbox.restore();
  });

  it("should call the original jar", () => {
    expect(index.jar()).to.equal("jar"); // works fine
  });

  it("should call the stubbed jar", () => {
    sandbox.stub(index, "jar").returns("stub");
    expect(index.jar()).to.equal("stub"); // fails
  });
});


这是两个仅使用sinon存根的示例文件。发生相同的事情:

// stub.js
export function stub() {
  return "stub me";
}

// stub.test.js
import * as stub from "./stub";
import sinon from "sinon";
import chai from "chai";

const expect = chai.expect;
const sandbox = sinon.createSandbox();

const text = "I have been stubbed";

describe("sinon stubs", () => {
  afterEach(() => {
    sandbox.restore();
  });
  it("should stub", () => {
    sandbox.stub(stub, "stub").returns(text);
    expect(stub.stub()).to.equal(text); // fails
  });
});


这是用于摩卡咖啡的babelrc

{
   "presets": [
     "@babel/preset-env"
   ],
   "plugins": [
     "rewire"
   ]
}


如果我从插件中删除了rewire,问题就解决了。尽管显然这意味着我不能使用rewire,但是正如我前面提到的那样,为了在同一依赖项中存根函数,我需要使用rewire。这是该模块的错误,还是我在这里缺少了什么?

最佳答案

我的一项测试也遇到了同样的问题。退出用户后,有一项操作触发了页面重定向。重定向本身是在单独的文件中实现的。

import * as utils from '../utils.js';
import sinon from 'sinon';

it('will dispatch an action and redirect the user when singing out', () => {
    const redirectStub = sinon.stub(utils, 'redirect').returns(true);
    // dispatch and assertion of action omitted
    expect(redirectStub.calledOnce).toBeTruthy();
    redirectStub.restore();
});


然后,由于各种原因,我不得不在测试中添加babel-rewire-plugin。这打破了上面的特定测试。 calledOnce或任何其他sinon方法始终返回false

不幸的是,我无法继续进行间谍/窃听工作。我不得不像这样重写我的测试:

import { __RewireAPI__ } from '../utils.js';
import sinon from 'sinon';

it('will dispatch an action and redirect the user when singing out', () => {
    __RewireAPI__.__Rewire__('redirect', () => true);
    // dispatch and assertion of action omitted
    __RewireAPI__.ResetDependencty('redirect');
});


如您所见,不再有间谍或存根断言。我重新连接了redirect方法,然后将其重置。

但是,有一个babel-plugin-rewire-exports库,它似乎允许您重新接线和监视/存根。我自己还没有尝试过,但是如果您不想重写测试,可以选择它。这是link

09-16 20:32