6

だから私は関数をテストしようとしています.これはクライアント側の関数(未終了)であるため、テスト自体に埋め込まれています(より良い解決策が見つかるまで).

私が抱えている問題は、関数が TypeError をスローしているかどうかをテストするときです。

問題は、関数自体ではなく戻り値をテストしているためだと理解していますが、これを回避する方法がわかりません。

どんな助けでも大歓迎です!

テープ


test.js

var test  = require('tape');


test('GenerateRandomNumber Tests', function(assert){  

  /**
   * Generates a random number between the min/max
   * @param {int} the min value 
   * @param {int} the max value 
   * @param {array} list of values already stored
   * @return {mixed} int if success, false if exception thrown
  **/
  var GenerateRandomNumber = function( min, max, tickets ){
        
    try{
      
      if(!tickets instanceof Array){
        throw new TypeError();
      }
      
      min = (min) || 0;
      max = (max) || 200;
      
      var n = 0;

      n = ~~(Math.random() * (max - min) + min); 
      
      if(tickets.indexOf(n) === 1){
        GenerateRandomNumber(min, max);
      }
      
      return n;
      
    }catch(e){ return false; } 
    
  };
  
  assert.plan(4);
  
  
  var t1 = GenerateRandomNumber(0, 300, null);
  assert.equal(typeof t1, "boolean", "Should return a boolean - false");
  
  var t2 = GenerateRandomNumber(0, 300, [0,1,2,3,4]);
  assert.equal(typeof t2, "number", "Should return a typeof number");
  
  // HELP
  assert.throws(GenerateRandomNumber(0, 300, null), TypeError, "Should throw typeError");
  
  var t4 = GenerateRandomNumber(null, null, [0,1,2,3,4]);
  assert.equal(typeof t4, "number", "Should return a typeof number");
  
  
});
4

1 に答える 1

9

最初の問題は、それ!tickets instanceof Arrayがあなたが望むロジックではないということです。それが行うことは、最初に not 操作を実行してticketsから、それが であるかどうかをテストすることですinstanceof Array。したがって、実際に必要なのは次のとおりです。

if(!(tickets instanceof Array)){
   throw new TypeError();
}

次の問題は、あなたが言ったように、の戻り値を取得していることですGenerateRandomNumber。これは、エラーがスローされた場合false、TypeError ではありません。try/catch を保持して false を返したい場合は、テストGenerateRandomNumberは必要ありませんが、次のようなものは必要ありません。throws

assert.equal(GenerateRandomNumber(0, 300, null), false, "Should catch the TypeError and return false)

使用したい場合はassert.throws、try/catch を削除してGenerateRandomNumber、代わりに次のようにする必要があります。

var test  = require('tape');


test('GenerateRandomNumber Tests', function(assert){  

  /**
   * Generates a random number between the min/max
   * @param {int} the min value 
   * @param {int} the max value 
   * @param {array} list of values already stored
   * @return {mixed} int if success, false if exception thrown
  **/
  var GenerateRandomNumber = function( min, max, tickets ){
      if(!(tickets instanceof Array)){
        throw new TypeError('error');
      }

      min = (min) || 0;
      max = (max) || 200;

      var n = 0;

      n = ~~(Math.random() * (max - min) + min); 

      if(tickets.indexOf(n) === 1){
        GenerateRandomNumber(min, max);
      }

      return n;
  };

  assert.plan(3);

  var t2 = GenerateRandomNumber(0, 300, [0,1,2,3,4]);
  assert.equal(typeof t2, "number", "Should return a typeof number");

  // You must wrap GenerateRandomNumber from within another function 
  //so that the error being thrown doesn't cause the program to exit
  assert.throws(() => GenerateRandomNumber(0, 300, null), /error/, "Should throw typeError");

  var t4 = GenerateRandomNumber(null, null, [0,1,2,3,4]);
  assert.equal(typeof t4, "number", "Should return a typeof number");


});

RegExp を渡すオプションを使用したのは、期待どおりに関数を渡すときのテープのエラーの一致が非常に奇妙だからです (この問題を参照してください)。私はまだこの方法でそれを行うためのオプションを検討していますが、これが今のところ役立つことを願っています.

于 2015-12-07T20:51:53.333 に答える