调用时如何从spy.on(obj, 'funcName') 返回假数据?

nar*_*gar 7 javascript unit-testing mocha.js node.js chai

不知道有没有这个功能!请告诉我这可能吗?

像这样的东西:

spy(obj, 'funcName').and.returnValue(5); // spy will return a fake data when 'funcName'called.
Run Code Online (Sandbox Code Playgroud)

嗯,我正在使用mochachai-spies

DIL*_*ILP 5

考虑使用存根来代替间谍。

\n\n

根据文档:

\n\n
\n

测试存根是具有预编程行为的函数(间谍)。除了可用于更改存根\xe2\x80\x99s 行为的方法之外,它们还支持完整的测试间谍 API。

\n
\n\n

存根有一个“返回”方法来完成您正在寻找的事情。

\n\n
var stub = sinon.stub();\n\nstub.returns(54)\n\nstub(); // 54\n
Run Code Online (Sandbox Code Playgroud)\n


Nat*_*son 1

看起来他们添加了一个chai.spy.returns函数来做到这一点,但 API 对我来说似乎有点奇怪。我从他们的主分支安装了最新的代码并做了一些尝试。这是我尝试过的:

\n\n
var chai = require(\'chai\'),\n    spies = require(\'chai-spies\');\n\nchai.use(spies);\nvar expect = chai.expect;\nvar obj = null;\n\ndescribe(\'funcName\', function() {\n\n  beforeEach(function() {\n    obj = {\n      funcName: function() {\n        return true;\n      }\n    }\n  });\n\n  // PASSES\n  it(\'returns true by default\', function() {\n    expect(obj.funcName()).to.be.true\n  });\n\n  // PASSES\n  it(\'returns false after being set to a spy\', function() {\n    var spyFunction = chai.spy.returns(false);\n    obj.funcName = spyFunction;\n    expect(obj.funcName()).to.be.false\n  });\n\n  // FAILS\n  it(\'returns false after being altered by a spy\', function() {\n    chai.spy.on(obj, \'funcName\').returns(false);\n    expect(obj.funcName()).to.be.false\n  });\n\n});\n
Run Code Online (Sandbox Code Playgroud)\n\n

运行这些测试的输出是:

\n\n
funcName\n  \xe2\x9c\x93 returns true by default\n  \xe2\x9c\x93 returns false after being set to a spy\n  1) returns false after being altered by a spy\n\n\n2 passing (14ms)\n1 failing\n\n1) funcName returns false after being altered by a spy:\n   TypeError: Object #<Object> has no method \'returns\'\n    at Context.<anonymous> (test.js:31:34)\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,他们似乎希望您实例化一个带有返回值的间谍对象,然后用它替换该funcName函数obj。您无法监视一个函数并一次性设置其返回值。

\n\n

此外,该功能是在2015 年 10 月添加的,此后他们就没有发布新版本。我的建议是使用更成熟的库,例如Sinon.js来进行间谍和存根。您可以使用他们的Stub API来更改函数的返回值:

\n\n
sinon.stub(obj, \'funcName\').returns(5);\n
Run Code Online (Sandbox Code Playgroud)\n\n

Stub API 提供了更多改变函数行为的方法,甚至允许您用完全自定义的函数替换它:

\n\n
var func = function() {...}\n\nsinon.stub(obj, \'funcName\', func);\n
Run Code Online (Sandbox Code Playgroud)\n