0

JavaScriptコードをテストするためにQUnitを使用しようとしています。私は単純な機能を持っています:

function Multiply(a, b) {
    return a * b;

}

function CalculateBodyMassIndex(weight, height) {
    return Math.round(weight / Multiply(height, height));

}

function SummAll(array) {
    var summ = 0;
    $.each(array, function (i, el) {
       summ = summ + el;
    });
    return summ;

}

2 つの質問があります。1) 関数 CalculateBodyMassIndex が Multiply 関数と呼ばれることをどのように確認できますか?

2) 関数 SummAll で $.each が jQuery ライブラリから呼び出されることを確認するにはどうすればよいですか?

回答をお待ちしております。

4

3 に答える 3

2

これは、モック用の QUnit で sinon.js を使用する方法に関する優れた投稿ですhttp://cjohansen.no/en/javascript/using_sinon_js_with_qunit

sinon のスパイとスタブを使用すると、既存のオブジェクトの呼び出しを非常に簡単に検証できます。

EDIT ここの sinon.js ドキュメントhttp://sinonjs.org/docs/#spiesは、スパイの使用方法を示しています。スタブやモックなどの例については、完全な API ドキュメントを参照してください。

于 2012-06-06T14:43:41.037 に答える
0

次の html を貼り付けて、ブラウザから開くだけです。

<html>
  <head>
    <title>test</title>
    <link rel="stylesheet" href="http://code.jquery.com/qunit/qunit-1.11.0.css">
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
    <script src="http://code.jquery.com/qunit/qunit-1.11.0.js"></script>
    <script src="http://sinonjs.org/releases/sinon-1.6.0.js"></script>
    <script src="http://sinonjs.org/releases/sinon-qunit-1.0.0.js"></script>
    <script type="text/javascript">
      function Multiply(a, b) {
        return a * b;
      }

      function CalculateBodyMassIndex(weight, height) {
        return Math.round(weight / Multiply(height, height));
      }

      function SummAll(array) {
        var summ = 0;
        $.each(array, function (i, el) {
          summ = summ + el;
        });
        return summ;
      }
    </script>
  </head>
  <body>
    <div id="qunit"></div>
    <script type="text/javascript">
      $(function(){
        test('Multiply', function(){
          $.each([
            [[0, 2], 0],
            [[3, 3], 9],
            [[7, 9], 63]
          ], function(){
            var t = this.toString();
            equal(
              Multiply.apply(this, this[0]), this[1],
              t + ': Multiply ok'
            );
          });
        });

        test('CalculateBodyMassIndex', function(){
          this.spy(window, 'Multiply');
          $.each([
            [[1, 2], 0],
            [[10, 2], 3],
            [[35, 3], 4]
          ], function(i){
            var t = this.toString();
            equal(
              CalculateBodyMassIndex.apply(this, this[0]), this[1],
              t + ': CalculateBodyMassIndex ok'
            );
            ok(Multiply.calledOnce, t + ': call Multiply ok');
            deepEqual(
              Multiply.args[0], [this[0][1], this[0][1]],
              t + ': Multiply args ok'
            );
            Multiply.reset();
          });
        });

        test('SummAll', function(){
          $.each([
            [[1, 2, 3, 4, 5], 15],
            [[2, 3, 4, 5, 6], 20],
            [[3, 4, 5, 6, 7], 25]
          ], function(){
            var t = this.toString();
            equal(
              SummAll(this[0]), this[1],
              t + ': SummAll ok'
            );
          });
        });
      });
    </script>
  </body>
</html>
于 2013-04-14T14:28:59.707 に答える
-1

関数のスコープを利用して、モック可能な関数でオプションの引数を許可するのが最も簡単です。

function CalculateBodyMassIndex(weight, height, using) {
  return Math.round(weight / (using || Multiply)(height, height));
} 

次に、テストで:

var MockMultiplyRan = false;
var MockMultiply = function(a,b) {
    MockMultiplyRan = true;
    return Multiply(a,b);
}

CalculateBodyMassIndex(200,200, MockMultiply); // arbitrary figures
ok(MockMultiplyRan);
于 2012-06-06T14:17:01.980 に答える