2017-02-09 60 views
1

我现在正在认真地考虑这个问题。我在一个我试图测试的方法中有一行代码,我无法通过我所做的任何事情。有用! “现实世界”中没有任何错误。未定义不是Mocha/Chai/Sinon在PhantomJS上的构造函数,Array.prototype.find

我发现每次我钻研JS单元测试我碰到这样的困难,它让我怀疑它是否真的值得。

这里是我想要测试方法...

_mapStopsAroundHub(managerContext, soCode, homePostcode, homeStops, changeLinkedStopCallback) { 
    homeStops = homeStops || []; 
    MappingDataGateway.getNearbyStops(soCode, homePostcode, Cfg.DefaultNearbyStopDistance, (stops, status, xhr) => { 
     if(status == MappingDataGateway.Status.OK) { 
      stops.forEach((element) => { 
       let isHomeStop = homeStops.length > 0 && (homeStops.find(hs => hs.id === element.id) !== undefined); 
       let markerColor = isHomeStop ? "green" : "orange"; 
       let marker = managerContext.addBusStopMarker(element, markerColor); 
       if (changeLinkedStopCallback) { 
        managerContext._api.event.addListener(marker, 'click',() => { 
         let newIcon = marker.icon.includes("orange") ? `/images/fa-bus-green.png` : `/images/fa-bus-orange.png`; 
         marker.setIcon(newIcon); 
         changeLinkedStopCallback(marker.data); 
        }) 
       } 
      }); 
     } 
     else if (errorCallback) { errorCallback(xhr); } 
    }); 
} 

我已经添加了“isHomeStop”变量和完全不必要homeSTops.length检查,让一些测试用例通过,但我无法测试homeochatop数组中包含数据的情况,因为Mocha因为它非常有用的错误消息“未定义不是构造函数”类型消息而失败。完整的错误是如下...

PhantomJS 2.1.1(视窗8 0.0.0)MapsManager可以与加载的地图interract绕轮毂点挡块直接与连接止挡映射所有可选停止映射在该区域示出了在不同的颜色选择的链接的停止FAILED 未定义不是(评价 'homeStops.find(功能(HS){ 返回hs.id === element.id; })')构造

失败的测试看起来像这样...

it("directly with a linked stop mapping all selectable stops in the area showing selected linked stops in a different colour",() => { 
      let allStops = [{ id: 1 }, { id: 2 }, { id: 3 }]; 
      let homeStops = [{ id: 2 }]; 
      let mappingDataStub = Sinon.stub(MappingDataGateway, 'getNearbyStops'); 
      mappingDataStub.yields(allStops, "OK"); 
      let addMarkerStub = Sinon.stub(objUt, 'addBusStopMarker'); 

      objUt._mapStopsAroundHub(objUt, testSoCode, testPostCode, homeStops); 
      mappingDataStub.restore(); 
      addMarkerStub.restore(); 

      Sinon.assert.calledThrice(addMarkerStub); 
      Sinon.assert.calledWith(addMarkerStub, allStops[0], "orange"); 
      Sinon.assert.calledWith(addMarkerStub, allStops[1], "green"); 
      Sinon.assert.calledWith(addMarkerStub, allStops[2], "orange"); 
     }); 

我已经在代码中放入了未定义的检查来检查对象的状态,它在那里 - 它似乎是在查找内的lambda表达式上摔倒。

其他信息:这似乎只发生在PhantomJS - 如果我使用Chrome所有运行正常(虽然这不是一个可行的CI选项!)。

+0

您是否在代码中的任何位置使用'new'?听起来有可能错误信息中的行号是错误的 – Bergi

+0

可能在我的代码中的不同位置,但不在我正在测试的方法中。错误消息明确指出了我正在测试的方法的第6行的转译版本。如果有任何事情出错,这是摩卡有史以来最少的错误消息之一。我不知道,如果摩卡/柴/诗乃只是一堆垃圾,我应该回去使用茉莉花。尽管在这个阶段做了大规模的改革。 –

回答

1

PhantomJS可能不支持Array.prototype.find。在测试助手文件中添加一个polyfill,它将解决您的问题。 Polyfill on MDN

+0

不错!我在同一时间发现了这一点(你可以有答案投票,但!) –

+0

没有问题,PhantomJS是一种痛苦,你可能会发现更多的东西不起作用。请享用! – Lee

+0

哦,快乐!(JS单元测试对我来说是一种爱/恨的东西) –

0

尝试使用latest version 2.5b,它具有最新的Webkit abd完全支持ES6。

+0

这听起来不错,但我不认为它适合与我的NPM依赖树一起使用,所以当它到达CI的Azure时,它最终会变得毫无用处建立(我宁愿让它先在本地堆放)。看起来polyfills现在是我的前进方向。 –