如果可以使用名称创建间谍(对象属性除外),则有助于断言错误消息的可读性。 例如,茉莉花间谍就允许这样做。
Sinon检查包装的函数名称。 因此,您可以通过包装一个空的命名函数来为间谍命名。
var spy = sinon.spy(function doStuff() {});
该技术还允许您产生具有特定长度的函数:
var spy = sinon.spy(function doStuff(a, b, c) {}); // spy.length === 3
据我所知,它始终是“代理”作为函数名称。 您确定此评论正确吗?
据我所知,它始终是“代理”作为函数名称。 您确定此评论正确吗?
您介意发布一个可运行的示例吗?
// test/index.js
var sinon = require('sinon');
var spy = sinon.spy(function doStuff() {
console.log('Name: ' + spy.name);
});
spy();
➜ sinon-test node test/index.js
Name: proxy
我不记得以前做过什么,但是我从失败的测试中获取了Mocha的输出,其中函数名称为“ proxy”,而您不知道它为“ doStuff”。 如果我能确切记得那是什么,我将发布
我看到了它总是说名字是proxy
-但如果我Object.defineProperty(spy, 'name', { value: 'new name' })
则报告“新名字”。
重新打开它会很棒。
我通过以下方法解决了这个问题:
const mapMethod = sinon.spy(Array.prototype, 'map');
const methodName = map.wrappedMethod.name;
console.log(methodName); // 'map'
@Tbhesswebber在非测试代码依赖函数名时不起作用。
啊...很好。 我正在研究用于教授高阶函数的课程(使用Array.prototype
作为起点),这就是导致我遇到此问题的原因。 非常不同的用例!
PS-当您实际尝试时,测试实现细节确实很繁琐!
我可以看到这将是有用的。 如果有人想对此进行更深入的研究,那将很酷。
可能是某些功能或测试取决于返回的函数的名称。 如果是这样,我们应该讨论如何解决它。
@mroderick在创建带有原始间谍的间谍时, Object.defineProperty(spy, 'name', { configurable: true, value: spy.wrappedMethod.name })
应该这样做吗?
我认为这曾经是我们所拥有的功能-通过为功能命名来命名间谍-猜想它在途中迷路了。 我同意允许明确命名的建议。 但是我们是否也应该更改“代理”名称? 我觉得间谍功能应该看起来像原始功能一样近。 我们确保正确的Arity,但现在更改名称。 似乎不对。
我刚刚意识到我们在API中也有spy.named(name)
😆它将在间谍上设置displayName
属性。 我认为,它也应该更改函数名称。 现在看看这个。
#1987的补丁发布在v7.2.7
。 请让我们知道这是否对每个人都令人满意❤️
最有用的评论
我看到了它总是说名字是
proxy
-但如果我Object.defineProperty(spy, 'name', { value: 'new name' })
则报告“新名字”。重新打开它会很棒。