17

I've created a database wrapper for my application, shown below. To test it, I obviously would like to replace the actual database library. I could create a new class that mocks the query method and catch all input there, but using sinon.js seems more appropriate, but how would I use it?
Is the mock or stub features of sinon.js what I should be using?

wrapper = (function() {

  function wrapper() {}

  wrapper.db = require("database");

  wrapper.prototype.insertUser = function(doc) {
    return this.db.query("INSERT INTO USERS...");
  };

  return wrapper;

})();
4

2 に答える 2

10

まず、クラス定義を少し変更します(大文字のクラス名とデータベースの割り当てを修正します)。

var Wrapper = (function() {

  function Wrapper() {
    this.db = require("database");
  }

  Wrapper.prototype.insertUser = function(doc) {
    return this.db.query("INSERT INTO USERS...");
  };

  return Wrapper;

})();

クラス全体をスタブするには:

var WrapperStub = sinon.spy(function() {
  return sinon.createStubInstance(Wrapper);
});

sinon.createStubInstanceすべてのメソッドがスタブであるWrapperのインスタンスを作成します。sinon.spyクラスのインスタンス化をスパイできるようになります。

したがって、次のように実行できます。

// verify instantiation
var wrapper = new WrapperStub();
expect(WrapperStub).to.have.been.calledWithNew;

// verify method stub
wrapper.insertUser.returns('data');
expect(wrapper.insertUser()).to.equal('data');
expect(wrapper.insertUser).to.have.been.calledOnce;

(アサーションはチャイシノンチャイを使用します)

このコードスニペットは実際の単体テストではないため、「実行する」とだけ言いました。インスタンス化とメソッド呼び出しは、テスト対象のサブジェクトによって行われます。

ここで、require()によって注入された依存性をモックしたい場合(例のように)、 Jest(ただし、sinonは使用しない)またはJestに触発されて作成したsinonquiredb = require('database')のようなテストツールを試すことができますが、 sinonとお気に入りのテストツール(私のものはmochaです)。内部的には、sinonquireは、クラスを結合してスタブ化するという上記と同じ手法を使用します。sinon.spysinon.createStubInstance

于 2015-10-28T04:53:37.947 に答える
8

そのために両方を使用できます。

モックには予想される順序付けられた動作があり、正しく従わないとエラーが発生します。

スタブはモックに似ていますが、順序がないため、メソッドを好きなように呼び出すことができます。私の経験では、モックはほとんど必要ありません。

どちらも、メソッドを空のメソッドに置き換えるか、パスした場合はクロージャに置き換えます。これは次のようになります。

stub = sinon.stub(wrapper , 'insertUser ', function () { return true; });

次に、expect動作を追加して、それが発生したかどうかを確認します。

テストのチェックには、Jasmine-Sinonと一緒にJasmineを使用するのが好きです。

于 2012-10-10T12:30:42.490 に答える