gpt4 book ai didi

javascript - jasmine.createSpyObj 与属性

转载 作者:行者123 更新时间:2023-12-03 15:10:17 24 4
gpt4 key购买 nike

在我的 Angular 测试中模拟依赖项时,我通常使用 jasmine.createSpyObj 创建一个 spy 对象。 :

const serviceSpy= jasmine.createSpyObj('MyService', ['method']);
然后将其提供给 TestBed:
  providers: [
{provide: MyService, useValue: serviceSpy}
]
当我在测试中使用它时,我可以指定所需的返回值:
serviceSpy.method.and.returnValue(of([...]));
现在我还需要模拟属性,但我不知道应该怎么做。 createSpyObj确实允许定义属性名称:
const serviceSpy= jasmine.createSpyObj('MyService', ['method'], ['property']);
但我已经尝试了基于大量文章和答案的各种解决方案,但没有任何成功,例如:
// Cannot read property 'and' of undefined    
serviceSpy.property.and.returnValue(true);
// not declared configurable
spyOnProperty(serviceSpy, 'property').and.returnValue(true);
// no build errors, but value stays 'undefined'
serviceSpy.property = true;
我可以使它“一半”工作的唯一方法是:
let fakeValue = true;
const serviceSpy= jasmine.createSpyObj('MyService', ['method'], {'property': fakeValue});
这里的问题是它在创建时是一次性的。如果我想更改测试中的期望值,它不起作用。
fakeValue = false;
serviceSpy.property ==> stays to the initial value 'true';
是否存在通过创建 spy 对象来模拟方法和属性的解决方案,或者我应该创建自己的假类,然后我可以在其上使用 spyOnspyOnProperty ?
我还想知道 createSpyObj 中的属性数组的用途是什么定义。到目前为止,我还没有在网上看到任何解释它的例子。

最佳答案

根据 the documentation (强调我的):

You can create a spy object with several properties on it quickly bypassing an array or hash of properties as a third argument tocreateSpyObj. In this case you won’t have a reference to the createdspies, so if you need to change their spy strategies later, you willhave to use the Object.getOwnPropertyDescriptor approach.

it("creates a spy object with properties", function() {
let obj = createSpyObj("myObject", {}, { x: 3, y: 4 });
expect(obj.x).toEqual(3);

Object.getOwnPropertyDescriptor(obj, "x").get.and.returnValue(7);
expect(obj.x).toEqual(7);
});

spy 属性是描述符(参见例如 Object.defineProperty on MDN ),因此要访问 spy 对象,您需要获取描述符对象,然后与 get 交互和 set上定义的方法。

在 TypeScript 中,编译器需要一些帮助。 createSpyObj 返回 anySpyObj<T> , 和 SpyObj仅将方法定义为被监视:
type SpyObj<T> = T & {
[K in keyof T]: T[K] extends Func ? T[K] & Spy<T[K]> : T[K];
// | if it's a | spy on it | otherwise leave
// | callable | | it alone
};
所以访问 .and在描述符的 getter 上,您需要 optional chaining (因为 Object.getOwnPropertyDescriptor 可能返回 undefined )和 type assertion Spy :
(Object.getOwnPropertyDescriptor(obj, "x")?.get as Spy<() => number>).and.returnValue(7);
Playground

关于javascript - jasmine.createSpyObj 与属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64560390/

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