javascript - jasmine jquery 测试检查是否已将正确的参数传递给方法

标签 javascript jquery jasmine jasmine-jquery

我是 JavaScript 测试新手。 我正在使用 jasmine,需要测试是否已将正确的参数传递给方法。

这是我的方法:

    function myView(){
      if($('.view').is('.list')){
          myWindow('list');
      }else{
          myWindow('random');
      }
      $('.view').toggleClass('my-list');
    }

    function myWindow(list) {
      var url = /test.json;
      $.post(url, {"list": list});
    }

Here are my tests:

  describe('#myView', function() {
    beforeEach(function() {
      fixture.load('myview.html');
    });

    it('sets window to list', function(){
      expect(window.myWindow).toHaveBeenCalledWith('list');
    });
  });

我收到以下错误。

Error: Expected a spy, but got Function.

如果我在期望之前添加此行(这似乎是错误的,因为我指定了应由测试识别的正确参数)

spyOn(window, myWindow('list'));

我收到以下错误:

undefined() method does not exist

有人可以告诉我编写上述测试的好方法吗?

最佳答案

spyOn 的第二个参数是您需要监视的属性的名称。当您调用 spyOn(window, myWindow('list')); 时,您的第二个参数是 myWindow( 的返回值 'list') 这是未定义 => 抛出错误:undefined() 方法不存在

在您的代码中,只需执行以下操作即可:

describe('#myView', function() {
    beforeEach(function() {
      fixture.load('myview.html');
    });

    it('sets window to list', function(){
      spyOn(window, "myWindow");//spy the function
      myView();//call your method that in turn should call your spy
      expect(window.myWindow).toHaveBeenCalledWith('list');//verify
    });
  });

在软件单元测试中,有一个概念叫做 stub and mock objects 。这些是被测方法的依赖关系。 spyOn 是创建你的假对象来测试你的方法。

您正在直接访问全局window对象,这确实是单元测试中的一个问题。 尽管Javascript是一种动态类型语言,我们仍然能够模拟您的window对象(这不是对于某些静态类型语言(如 c#)是可能的。 但是要创建良好的可单元测试代码,我建议您应该重新设计代码以从外部注入(inject)它。

function myView(awindow){ //any dependency should be injected, this is an example to inject it via parameter

      if($('.view').is('.list')){
          awindow.myWindow('list');
      }else{
          awindow.myWindow('random');
      }
      $('.view').toggleClass('my-list');
    }

试试这个:

describe('#myView', function() {
    beforeEach(function() {
      fixture.load('myview.html');
    });

    it('sets window to list', function(){
      var spy = {myWindow:function(list){}};
      spyOn(spy, "myWindow"); //create a spy
      myView(spy); //call your method that in turn should call your spy
      expect(spy.myWindow).toHaveBeenCalledWith('list'); //verify
    });
  });

还有一点,像这样的 jQuery 代码不太适合进行单元测试,因为它涉及代码中的 DOM 操作。如果你有时间,你应该看看angularjs将 View (DOM)与模型(逻辑)分开的框架,使用dependency injection使您的代码可测试。

关于javascript - jasmine jquery 测试检查是否已将正确的参数传递给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19440865/

相关文章:

javascript - 如何使用 apply/call 闭包通过嵌套对象传递变量

javascript - Highstock - 在标志工具提示内插入 HTML 链接

jquery - 阅读更多/更少使用 jquery 而不丢失 html

angular - 使组件测试具有主体或模拟 Renderer2

javascript - 防止Jasmine测试expect()在JS执行完成之前解析

javascript - 网站媒体播放器与网站导航栏冲突

Javascript多步表单不进入下一步

JavaScript - 延迟执行某些 JavaScript

javascript - 在 Ruby on Rails 中执行远程 (ajax) 调用的正确方法

angular - 如何使用 Jasmine 单元测试测试私有(private)方法