Vue.js Jest spyOn报告了一个使用不同对象调用的方法,而不是实际使用的方法

Vue.js Jest spyOn报告了一个使用不同对象调用的方法,而不是实际使用的方法,vue.js,jestjs,Vue.js,Jestjs,我正在使用JestspyOn跟踪Vue路由器上的一个方法。我正在测试的Vue方法如下所示: myMethod() { this.$router.push({ name: "login" }); } 我想确保调用了$router.push,因此在我的测试中我有以下内容: const spy = jest.spyOn(wrapper.vm.$router, 'push'); expect(spy).toHaveBeenCalledWith({ name: "login" }); 但是,此测试

我正在使用Jest
spyOn
跟踪Vue路由器上的一个方法。我正在测试的Vue方法如下所示:

myMethod() {
  this.$router.push({ name: "login" });
}
我想确保调用了
$router.push
,因此在我的测试中我有以下内容:

const spy = jest.spyOn(wrapper.vm.$router, 'push');
expect(spy).toHaveBeenCalledWith({ name: "login" });
但是,此测试失败,错误如下:

Expected mock function to have been called with:
        {"name": "login"}
      as argument 1, but it was called with
        {"name": "login", "params": {}, "path": "/login"}.
没问题,我可以将测试更新为以下内容,并且可以正常工作:

expect(spy).toHaveBeenCalledWith({
  name: "login",
  params: {},
  path: "/login"
});

我的问题是:为什么Jest spy报告说它是用一个具有三个属性的对象调用的,但当我们查看实际的方法调用时,它只有一个属性?

vue router
参数和
路径
属性添加一些默认值。当您使用
spyOn
时,您还将检测到由
vue路由器
分配的其他参数。如果将
spy
显式添加到
push
方法中,则只会看到
name
属性

试试这个:

const spy = jest.fn();
wrapper.vm.$router.push = spy;
expect(spy).toHaveBeenCalledWith({ name: "login" });

tobeencalledtimes(1)
给了你什么?@Krimson它过去了!所以我假设它在内部被调用了不止一次?@Krimson我正在测试的方法只调用router.push一次,而且这个方法不应该被调用。哦,我明白你的意思了。我误解了您的回答问题是$router.push是只读属性:/这就是为什么我使用spy而不是用模拟函数覆盖它。我感兴趣的是spyOn不会检测默认添加的任何值。是这样吗?