8

我正在尝试调试未触发的jQuery.post上的间谍,因此作为健全性检查,我尝试了

spyOn(this.viewModel.requests, 'submitRequest').andReturn('fooz');

var ret = this.viewModel.requests.submitRequest();
expect(ret).toEqual('foo');

expect(this.viewModel.requests.submitRequest).toHaveBeenCalled();

这失败了

预期 'fooz' 等于 'foo'。

但是当我在参数中更改'fooz'为时,测试失败了'foo'andReturn

submitRequest 上的预期间谍已被调用。

间谍正在返回预设值,那么为什么会toHaveBeenCalled失败?

4

2 回答 2

1

我知道这不应该是解决方案,但是您尝试过吗

var submitSpy = spyOn(this.viewModel.requests, 'submitRequest').andReturn('foo');

var ret = this.viewModel.requests.submitRequest();
expect(ret).toEqual('foo');

expect(submitSpy).toHaveBeenCalled();

因为有时这更一致

于 2012-06-20T13:10:10.070 回答
1

您的代码应该可以工作。我已经在 jasmine 独立示例上对其进行了测试:

it("tells the current song if the user has made it a favorite", function() {
  spyOn(song, 'persistFavoriteStatus').andReturn('foo');
  var ret = song.persistFavoriteStatus();
  expect(ret).toEqual('foo');

  expect(song.persistFavoriteStatus).toHaveBeenCalled();
});

我的直觉告诉我,您遇到的问题与 Jasmine 对通话前后的范围界定有关——我自己也遇到过类似的令人沮丧的情况。在测试开始时,我会检查以确保环境符合您的预期(例如,间谍被重置)。

于 2012-07-06T09:52:14.727 回答