使用JsUnit和JSMock的JavaScript测试驱动开发(下)

发表于:2009-6-01 14:46

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:Dennis Byrne    来源:InfoQ

使用JsUnit和JSMock的JavaScript测试驱动开发(上)

  JsMock,JavaScript的Mock对象库

  仔细查看你会发现testGetBalanceGoesToNetwork创建了自己的微型mocking框架。现在让我们重构测试,使用一种通用的mocking框架。我们需要在测试页面添加一个独立的脚本标签,并像这样重写测试:

<script type='text/javascript' src='../jsmock/jsmock.js'></script>


   function testGetBalanceWithMocks(){
      var mockControl = new MockControl();
      var networkMock = mockControl.createMock({
        send : function() {}
      });


      networkMock.expects().send('/getBalance.jsp', TypeOf.isA(Function));


      var slotMachine = new drw.SlotMachine(null, null, null, null, networkMock);


      slotMachine.getBalance();


      mockControl.verify();

    }

  现在使用更少的代码就能得到相同的反馈,我们甚至打下了更简单的基础,有利于进一步测试。如何做到这样的呢?代码的第一行使用JsMock提供的 MockControl构造函数创建一个对象。代码于是创建了一个有send方法的mock对象。在一个有实际NetworkClient类的应用程序中,我们甚至不必把一个object literal应用到createMock方法中。JsMock可以通过原型推断出来。

  var mock = mockControl.createMock(NetworkClient.prototype);

  一旦network客户端的mock对象创建之后,我们编程期望带有特定参数的send方法被调用了一次。我们关心服务器资源名称是正确的,并且第二个参数是一个回调函数。mock对象被注入到被测系统的构造函数中,通过MockControl对象的验证方法,验证交互行为从而得出结论。如果因为任何原因,老虎机的实现没有调用network客户端的send方法,或者与预期的参数不符,验证方法会抛出一个异常,测试会失败。

  现在让我们编写另外一个测试,验证一个drw.SlogMachine实例什么时候、多久回到客户端一次。如果服务器端响应完成之前getBalance方法被调用,我们不希望余额被返回两次。这会导致老虎机的余额两次返回到用户账户,并且花费额外的带宽。

function testGetBalanceWithMocksToTheNetworkOnce(){
      var mockControl = new MockControl();
      var networkMock = mockControl.createMock({
        send : function() {}
      });
      networkMock.expects().send('/getBalance.jsp', TypeOf.isA(Function));


      var slotMachine = new drw.SlotMachine(null, null, null, null, networkMock);


      slotMachine.getBalance();
      slotMachine.getBalance(); // no response from server yet
      slotMachine.getBalance(); // still no response


      mockControl.verify();
    }

  还记得我们在这里的第一个crack吗?当时我们创建了一个自己的微型mocking框架?那看上去像是一个实用的解决方案,但是你想像一下测试这样的交互行为,会写多少代码。仅仅由于参数的原因,让我们看看一个纯粹的stub解决方案,有多少瑕疵。

function testGetBalanceFlawed(){
      var networkStub = {
        send : function() {
          if(this.called)
            throw new Error('This should not be called > 1 time');
          this.called = true;
        }
      };

 

      var slotMachine = new drw.SlotMachine(null, null, null, null, networkStub);

      slotMachine.getBalance();
      slotMachine.getBalance(); // no response from server yet
      slotMachine.getBalance(); // still no response
    }

31/3123>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号