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)
当我们在同一个文件中有 2 个函数并且想要存根其中一个并测试另一个时。\n例如:\n测试:tests.js
\n\nlet 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\nfunction 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\nfoo.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\nconst 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\n
在这种情况下,sinon 存根比模拟更合适 \n何时使用模拟与存根?
\n\n\n\n\n经验法则是:如果您不想为某些特定调用添加断言,请不要模拟它。请改用存根。
\n
我们在测试中的断言不是针对函数 a 的特定调用,即第一个或第三个调用,而是针对所有调用。
\n\n我们可以告诉这一点,因为我们已经将存根编程为始终返回相同的结果,无论调用它的方式如何(参数或调用次数)。
\n\n将 sinon 存根函数作为参数传递给函数 a。
\n\nFunction a(b) {\n const c = b();\n\n return c;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n测试.js
\n\nrequire("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