位置重新加载Jasmine

use*_*294 4 javascript ruby-on-rails-3 jasmine

我真的不确定如何进行测试呢?(监视?)

function reloadPage() {
  $('#logo').click(function() {
    location.reload();
  })
}
Run Code Online (Sandbox Code Playgroud)

任何建议都会很棒!

Amy*_*Amy 5

您可能不确定如何测试这段代码的原因是因为它正在做两件不同的事情,你应该把它分解成更小的块.

我在这里看到两个不同的功能:

  • 点击事件处理
  • 重新加载页面

那么为什么不打破这样的逻辑呢?

function reloadPage() {
    location.reload();
}

function bindEvents() {
    $('#logo').click(reloadPage);
}
Run Code Online (Sandbox Code Playgroud)

现在您可以使用Spies单独测试它们:

describe('when the logo is clicked', function() {
   var logo;
   var handlers;
   beforeEach(function() {
       handlers = {
           locationReload: location.reload, // handle for location.reload()
           reloadPage: reloadPage      // handle for your reloadPage()
       };

       logo = $('#logo').click(reloadPage);

       // attach Spy on reloadPage() and let the function call through
       spyOn(handlers, 'reloadPage').and.callThrough();

       // attach Spy on location.reload() 
       spyOn(handlers, 'locationReload');

   });

   it('will execute reloadPage function', function() {
        logo.trigger('click');
        expect(handlers.reloadPage).toHaveBeenCalled();
   });

   it('will reload the page', function() {
        logo.trigger('click');
        expect(handlers.locationReload).toHaveBeenCalled();
   });

   afterEach(function() {
       // clean up event bindings after each test
       logo.off('click');
   });

});
Run Code Online (Sandbox Code Playgroud)

没有太多需要测试reloadPage处理程序是否正确添加到#logoclick事件中,因为测试模拟a .click()并检查是否reloadPage调用.

所以很可能你只需要有it('will reload the page')规格,而不是两者.