gpt4 book ai didi

javascript - 在单元测试中使用实际对象可以工作,但 Sinon Mocked 对象在 Javascript ES6 中不行

转载 作者:行者123 更新时间:2023-12-03 04:17:56 25 4
gpt4 key购买 nike

我试图在编写单元测试用例时使用 Sinon 来模拟依赖关系。我遇到了一些问题,但最终成功了。但它的工作方式对我来说真的很奇怪。

Employee依赖于类Data,因此Data对象被依赖注入(inject)到类Employee的构造函数中.

这是有效的代码:

class Data{
getName(){
return "Ram";
}
}

class Employee{
constructor(data){
this._data = data;
}

getName(){
return this._data.getName();
}
}

describe('canary suite', function(){
it('canary test', function(){

var data = new Data();
var mockData = sinon.mock(data);
mockData.expects('getName').returns('Raj');

var emp = new Employee(data); //here is the deviation.

expect(emp.getName()).equals('Raj');
mockData.verify();
mockData.restore();
});
});

如果我更改代码中的这一行:

var emp = new Employee(data);

var emp = new Employee(mockData);

它给出了这个错误:

TypeError: this._data.getName is not a function

我以前曾在 C# 中使用过模拟。但我将模拟对象传递给了构造函数。不是实际的对象。
有人可以帮助我理解诗农 mock 这种行为的原因吗?

最佳答案

在像 C# 这样的语言中,除了类型/接口(interface)和公共(public)/私有(private)范围之外,对象实例通常是不可变的。这意味着创建模拟作为原始对象的类/接口(interface)的“空壳”更为常见。

Javascript 最近才支持类和继承等,其核心是 Prototype-based语言。

来自道格拉斯·克罗克福德:

you make prototype objects, and then … make new instances. Objects are mutable in JavaScript, so we can augment the new instances, giving them new fields and methods. These can then act as prototypes for even newer objects. We don't need classes to make lots of similar objects… Objects inherit from objects.

这就是为什么在 Javascript 中模拟原始对象实例本身更有意义,也是为什么 Sinon 提供 restore() 来删除模拟行为。

关于javascript - 在单元测试中使用实际对象可以工作,但 Sinon Mocked 对象在 Javascript ES6 中不行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44065921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com