2017-11-29 14 views
1

より大きなReactアプリケーションの一部であるJavaScript関数をテストしようとしています。彼らは私が正しく理解していないかもしれないと思われるモジュールパターンを大量に使います。テストで定義されていないJavaScript mocked関数が返される

const GetFeedData = (function() { 
let feed, feedId; 
return { 
    getFeedId: function (sub) { 
     switch (sub) { 
      case '1': case '2': case '3': case '4': case '5': case '6': case 'S': 
       feedId = 1; 
       break; 
      case 'A': case 'C': case 'E': 
       feedId = 26; 
       break; 
      case 'N': case 'Q': case 'R': case 'W': 
       feedId = 16; 
       break; 
      case 'B': case 'D': case 'F': case 'M': 
       feedId = 21; 
       break; 
      case 'L': 
       feedId = 2; 
       break; 
      case 'G': 
       feedId = 31; 
       break; 
      } 
     }, 
     getFeedData: function() { 
      if (feedId === 2) { 
       feed = require('./MockData'); 
      } 
     }, 
     feed: feed 
    }; 
})(); 

const ReverseStop = (function() { 
    let stopIdN, stopIdS; 
    const stopData = require('../utils/stops'); 
    return { 
     reverseStop: function (sub, stop) { 
      var invalidEntries = 0; 
      function filterByName (item) { 
       if (item.stop_name == stop && typeof item.stop_id === 'string' && item.stop_id.charAt(0) == sub) { 
        return true; 
       } 
       invalidEntries ++; 
       return false; 
      } 
      var stopObjs = stopData.filter(filterByName); 
      for (var i = 0; i < stopObjs.length; i++) { 
       if (stopObjs[i].stop_id.charAt(stopObjs[i].stop_id.length - 1) == 'N') { 
        stopIdN = stopObjs[i].stop_id; 
       } else if (stopObjs[i].stop_id.charAt(stopObjs[i].stop_id.length - 1) == 'S') { 
        stopIdS = stopObjs[i].stop_id; 
       } 
      } 
     }, 
     stopIdN: stopIdN, 
     stopIdS: stopIdS 
    }; 
})(); 

export const IsDelayN = (function() { 
    let noDelay, yesDelay, nextArrival, delay; 
    return { 
     isDelay: function (sub, stop) { 
      GetFeedData.getFeedId(sub); 
      GetFeedData.getFeedData(); 
      ReverseStop.reverseStop(sub, stop); 
      var arrivals = []; 
      var delays = []; 
      function dataFilter() { 
       var invalidEntries = 0; 
       var feedObjs = GetFeedData.feed.filter(function (feedObj) { 
        if (feedObj.entity.trip_update.stop_time_update.stop_id == ReverseStop.stopIdN) { 
         return feedObj.entity.trip_update.stop_time_update; 
        } 
       }); 
       for (var i = 0; i < feedObjs.length; i++) { 
        arrivals.push(feedObjs.arrival.time.low); 
        delays.push(feedObjs.arrival.delay); 
       } 
      } 
      nextArrival = Math.min(...arrivals); 
      var delayIndex = arrivals.indexOf(nextArrival); 
      delay = delays.delayIndex; 
      if (delay === null || Math.ceil(delay/60) <= 5) { 
       noDelay = Math.ceil((nextArrival - GetFeedData.feed.header.timestamp.low)/60); 
      } else { 
       yesDelay = Math.ceil(delay/60); 
      } 
     }, 
     noDelay: noDelay, 
     yesDelay: yesDelay, 
     nextArrival: nextArrival 
    }; 
})(); 

export const IsDelayS = (function() { 
    let noDelay, yesDelay, nextArrival, delay; 
    return { 
     isDelay: function (sub, stop) { 
      GetFeedData.getFeedId(sub); 
      GetFeedData.getFeedData(); 
      ReverseStop.reverseStop(sub, stop); 
      var arrivals = []; 
      var delays = []; 
      function dataFilter() { 
       var invalidEntries = 0; 
       var feedObjs = GetFeedData.feed.filter(function (feedObj) { 
        if (feedObj.entity.trip_update.stop_time_update.stop_id == ReverseStop.stopIdS) { 
         return feedObj.entity.trip_update.stop_time_update; 
        } 
       }); 
       for (var i = 0; i < feedObjs; i++) { 
        arrivals.push(feedObjs.arrival.time.low); 
        delays.push(feedObjs.arrival.delay); 
       } 
      } 
      nextArrival = Math.min(...arrivals); 
      var delayIndex = arrivals.indexOf(nextArrival); 
      delay = delays.delayIndex; 
      if (delay === null || Math.ceil(delay/60) <= 5) { 
       noDelay = Math.ceil((nextArrival - GetFeedData.feed.header.timestamp.low)/60); 
      } else { 
       yesDelay = Math.ceil(delay/60); 
      } 
     }, 
     noDelay: noDelay, 
     yesDelay: yesDelay, 
     nextArrival: nextArrival 
    }; 
})(); 

を私がしようとしてること:ここで私は(実際に本物のそれGetFeedData.getFeedDataを除き、実際のアプリケーションで使用されるものとほぼ同じで、外部APIへの呼び出しを行う)をテストしていたスクリプトがあります私の関数から分離されているので、1つまたは2つの非常に長い関数ではなく、エクスポートされた関数で呼び出すことができるいくつかの短い関数があります。私はいくつかの変数 - GetFeedData.feedReverseStop.stopIdN、およびReverseStop.stopIdSをエクスポート関数で呼び出す必要があるため、モジュールパターンはコールバックを使うよりも良い方法だと仮定しています。私は完全に間違っている可能性があります。

私のテストでは、ログnoDelay,、およびdelayがコンソールに定義されているかどうかを確認します。その情報が役立つなら、私はJestを使っています。彼らは関連していないようですので、私は(それが間違っているなら、私を修正してください)今の私のテストの他の部分を省略しますが、ここでは、そのセクションは次のとおりです。私のconsole.log() sが全てです

it('correctly takes input at beginning of api logic and outputs expected values at end',() => { 
    IsDelayN.isDelay('L', 'Lorimer St'); 
    IsDelayS.isDelay('L', 'Lorimer St'); 

    expect(IsDelayN.noDelay).toBeTruthy(); 
    expect(IsDelayN.yesDelay).toBeFalsy(); 
    expect(IsDelayS.noDelay).toBeTruthy(); 
    expect(IsDelayS.yesDelay).toBeFalsy(); 
    console.log('IsDelayN noDelay: ' + IsDelayN.noDelay); 
    console.log('IsDelayN nextArrival: ' + IsDelayN.nextArrival); 
    console.log('IsDelayN delay: ' + IsDelayN.delay); 
    console.log('IsDelayS noDelay: ' + IsDelayS.noDelay); 
    console.log('IsDelayS nextArrival: ' + IsDelayS.nextArrival); 
    console.log('IsDelayS delay: ' + IsDelayS.delay); 
}); 

テスト前に合格すると、console.log()undefinedになります。また、実際に私のReactコンポーネントによって呼び出されているスクリプトも同じ結果を出しています。私は、これらの変数が定義されていない場合、nullをレンダリングするようにコンポーネントを設定しています。

これを理解する助けがあれば幸いです。

答えて

0

モジュールを正しく設定しないでください。メンバ値を設定するときにオブジェクトを変更する必要があります。これで変数値を設定するだけです。

以下はあなたのために働く必要があります。

var module = (function(){ 
 
     const ret = { 
 
     mutateSomething:function(value){ 
 
      //set otherValue on the object returned (mutate ret) 
 
      ret.otherValue = value; 
 
     } 
 
     ,otherValue:undefined 
 
     };//create the object first 
 
     return ret;//then return the object 
 
    }())//IIFE 
 

 
    console.log("before mutate:",module.otherValue); 
 
    module.mutateSomething("Hello World"); 
 
    console.log("after mutate:",module.otherValue); 
 

関連する問題