如何在ts-mockito中验证Location的search属性setter已被调用?
如何验证Location的search属性setter被正确调用?
已知Location接口定义如下:
interface Location { ... search: string; ... }
现有服务类代码:
export class MyService { constructor(private readonly location: Location) {} public myMethod(search: string): void { this.location.search = search; } }
对应的测试用例(基于jest-mock-extended):
describe('MyService', () => { it('should set search on location', () => { const location = mock<Location>(); const myService = new MyService(instance(location)); const someSearch = 'a=1'; myService.myMethod(someSearch); // 此处需要验证location.search的setter已被传入正确值调用 }); });
解决方案
根据你使用的测试工具,有两种可靠的验证方式:
方式一:直接断言属性最终值
这是最简洁的验证方式,直接检查location对象的search属性是否与传入的测试值一致:
expect(location.search).toBe(someSearch);
适合只需要确认最终结果正确的场景。
方式二:跟踪setter调用(验证执行过程)
如果需要明确验证search的setter方法确实被调用,且传入了正确参数,可以手动为属性定义spy函数:
describe('MyService', () => { it('should set search on location', () => { // 创建模拟对象,将search的setter设为jest spy const mockLocation = {} as Location; const setSearchSpy = jest.fn(); Object.defineProperty(mockLocation, 'search', { set: setSearchSpy, get: jest.fn() // 若接口需要getter则添加,否则可省略 }); const myService = new MyService(mockLocation); const someSearch = 'a=1'; myService.myMethod(someSearch); // 验证setter被调用且参数正确 expect(setSearchSpy).toHaveBeenCalledWith(someSearch); // 可选:验证调用次数 expect(setSearchSpy).toHaveBeenCalledTimes(1); }); });
这种方式更严谨,能确认代码确实执行了赋值操作,而非通过其他途径修改属性。
若你坚持使用jest-mock-extended的mock方法,也可直接断言属性值,该库的mock对象会自动跟踪属性赋值:
expect(location.search).toBe(someSearch); // 或使用对象属性断言 expect(location).toHaveProperty('search', someSearch);
内容的提问来源于stack exchange,提问作者kalsowerus
相关产品推荐
相关产品推荐

