如何监视 window.location 函数?

how to spy on window.location functions?

我需要用一些单元测试来覆盖我的代码,在其中一种情况下我遇到了以下情况。

app.tsx

           async someMethod(
.
.
.
                window.location.replace(sessionStorage.getItem(REDIRECT_VALUE));
.
.
.
            )

在我的测试文件中

      window.location.replace = jest.fn();
.
.
      somevariable.SomeMethod = jest.fn();

      expect(window.location.replace).toHaveBeenCalledWith("some url to redirect on");

我收到以下错误:无法分配给对象“[对象位置]”

的只读 属性 'replace'

我试过其他方法,比如

 backupState = window.location
 delete window.location;
 window.location = Object.assign(new URL("https://example.org"), {
 ancestorOrigins: "",
 replace: jest.fn()
 });

});

但是我得到的每个错误都不同,还有其他方法吗?

之前我用的是:

history.location.push(sessionStorage.getItem(REDIRECT_VALUE));

expect(auth.history.push).toHaveBeenCalled();

在这种情况下,测试正常。

一种测试方法是:

创建模拟函数 location.replace:

const replaceMock = jest.fn();

和 spyOn window,替换位置对象并设置 replaceMock 替换。

完整的测试示例:

const replaceMock = jest.fn();

describe('replace Location test ', () => {

  it('should call location with specific arg', () => {
    jest.spyOn(global as any, 'window', 'get').mockImplementationOnce(() => ({
      location: {
        replace: replaceMock,
      },
    }));

    someMethod();

    expect(replaceMock).toBeCalledWith('XX Value you want to test XX');
  });
});