【问题标题】:Jasmine spyOn calls original functionJasmine spyOn 调用原始函数
【发布时间】:2017-02-03 09:46:09
【问题描述】:

我的模块中有一个函数可以进行 AJAX 调用,成功后它会重定向用户。我想在 Jasmine 中测试该功能,但无法让页面不重新加载。

这是我的功能:

function my_func() {
    $.ajax({
        // parameters
        success: function(data) {
            // does something
            reloadPage(path);
        }
    });
}    
function reloadPage(path) {
    console.log('got here');
    window.location.href = path;
}

在我的测试中,我通过以下方式监视重新加载页面功能:

spyOn($, 'ajax').and.callFake(function(options) {
    options.success(data);
});
spyOn(my_module, 'reloadPage');
my_module.my_func();

当我运行测试时,我得到了这个:

LOG LOG: 'got here'
Firefox 42.0.0 (Linux 0.0.0) ERROR
  Some of your tests did a full page reload!

reloadPage 不应该被间谍代替而不是被调用吗?我已经包含了所有相关的代码部分,只是“字面意思”而已,但是如果您需要我提供更多信息,请告诉我!

【问题讨论】:

  • 你试过调换间谍的设置顺序吗?
  • 是的,还是同样的错误。

标签: javascript jquery unit-testing jasmine


【解决方案1】:

您的代码缺少对窗口重新加载的虚假调用(reloadPage 函数)。 此外,您还缺少成功函数中的 this 引用。

这是我修改您的代码的方式,它现在可以工作了。 你可以看到它在行动here

var my_module = {
  my_func: function() {
    var self = this;
    $.ajax({
      url: 'abc',
      success: function(path) {
        // does something
        self.reloadPage(path);
      }
    });
  },
  reloadPage: function(path) {
    console.log('got here');
    window.location.href = path;
  }
}

describe('reload page test', function() {
  it('test reload', function() {
    spyOn(my_module, 'reloadPage').and.callFake(function(e) {
      console.log("This is a spy call for reload page");
    });
    spyOn($, 'ajax').and.callFake(function(e) {
      e.success('some window url path');
    });
    my_module.my_func();
    expect(my_module.reloadPage).toHaveBeenCalled();
  })
});

【讨论】:

    猜你喜欢
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多