You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 21:55:15