如何使用sinon在另一个函数(我正在测试)中模拟一个函数?

Rav*_*kar 13 javascript function mocking mocha.js sinon

让我说我有一个功能

Func a() {
    //Do Something
    let c = b();
    return c;
}
Run Code Online (Sandbox Code Playgroud)

我想测试函数a和mock b(),并在mock中想要分配c.Sinon.Stub(试验中, "b")返回( "DummyValue"); c应该分配DummyValue.

我怎样才能做到这一点?

describe("a", () => {
    let a = a();
    //mock b();
    action = execute(a);
    expect(action).should.return.("DummyValue");
})
Run Code Online (Sandbox Code Playgroud)

Rav*_*kar 7

当我们在同一个文件中有 2 个函数并且想要存根其中一个并测试另一个时。\n例如:\n测试:tests.js

\n\n
let ComputeSumStub = sinon.stub(OfflineLoader, "ComputeSum");\nconst ans = function ()\n{\n    return 10;\n};\nComputeSumStub.returns(ans);\nconst actualValue: number = OfflineLoader.sum();\nexpect(actualValue).to.be.equal(10);\n
Run Code Online (Sandbox Code Playgroud)\n\n

开发者:foo.js

\n\n
function sum(): number\n{\n    return ComputeSum(8, 9);\n}\n\nfunction ComputeSum(a: number, b: number): number\n{\n    return a + b;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我们不能这样做,因为编译后函数会使用不同的签名和全名导出,并且在存根时我们存根全局函数,但在从另一个函数内调用它时,我们调用本地函数,因此它不会 \xe2\x80 \x99t 工作。\n有一个解决方法可以做到这一点。

\n\n
foo.js\nconst factory = {\n  a,\n  b,\n}\nfunction a() {\n  return 2;\n}\n\nfunction b() {\n  return factory.a();\n}\n\nmodule.exports = factory;\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试.js

\n\n
const ser = require(\'./foo\');\nconst sinon = require(\'sinon\');\n\nconst aStub = sinon.stub(ser, \'a\').returns(\'mocked return\');\nconsole.log(ser.b());\nconsole.log(aStub.callCount);\n
Run Code Online (Sandbox Code Playgroud)\n\n

参考:使用Sinon在同一文件中进行存根方法

\n


the*_*ode 0

在这种情况下,sinon 存根比模拟更合适 \n何时使用模拟与存根?

\n\n
\n

经验法则是:如果您不想为某些特定调用添加断言,请不要模拟它。请改用存根。

\n
\n\n

我们在测试中的断言不是针对函数 a 的特定调用,即第一个或第三个调用,而是针对所有调用。

\n\n

我们可以告诉这一点,因为我们已经将存根编程为始终返回相同的结果,无论调用它的方式如何(参数或调用次数)。

\n\n

将 sinon 存根函数作为参数传递给函数 a。

\n\n
Function a(b) {\n    const c = b();\n\n    return c;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

测试.js

\n\n
require("sinon")\n\ndescribe("a", () => {\n    const stub = sinon.stub();\n    stub.returns("DummyValue");\n    expect(a(stub)).to.eql.("DummyValue");\n})\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,我们可以使用 const 来声明这些变量,因为它们永远不会被重新分配。

\n

  • 我不想将函数/存根作为参数传递。我想在不传递函数 b 的情况下做到这一点。是否可以? (2认同)