0

これは私の前の質問と同じですが、これは変数ではなく関数に関するものです。私はモジュールを持っていて、その中の関数をモックしたいと思っています。これが私のcoffeescriptコードです:

root = exports ? this

root.prod = (->
  iWantToBeMocked = -> alert "production"
  doSomething = -> iWantToBeMocked()

  return {
    doSomething: doSomething
    iWantToBeMocked: iWantToBeMocked
  }
)()

root.test = (->
  root.prod.iWantToBeMocked = -> alert "I mocked this"
  root.prod.doSomething()

  return {}
)()

これは「生産」に警告しますが、「私はこれを嘲笑しました」と警告したいと思います。これどうやってするの?

出力を取得するJavaScriptは次のとおりです。

var root;

root = typeof exports !== "undefined" && exports !== null ? exports : this;

root.prod = (function() {
  var doSomething, iWantToBeMocked;
  iWantToBeMocked = function() {
    return alert("production");
  };
  doSomething = function() {
    return iWantToBeMocked();
  };
  return {
    doSomething: doSomething,
    iWantToBeMocked: iWantToBeMocked
  };
})();

root.test = (function() {
  root.prod.iWantToBeMocked = function() {
    return alert("I mocked this");
  };
  root.prod.doSomething();
  return {};
})();

アップデート

元の質問の答えを適用して、自分で問題を解決する方法を見つけました。

root = exports ? this

root.prod = (->
  iWantToBeMocked = -> alert "production"
  doSomething = -> this.iWantToBeMocked()

  return {
    doSomething: doSomething
    iWantToBeMocked: iWantToBeMocked
  }
)()

root.test = (->
  root.prod.iWantToBeMocked = -> alert "I mocked this"
  root.prod.doSomething()

  return {}
)()

this次の行に注目してくださいdoSomething = -> this.iWantToBeMocked()。しかし、ここでまだ答えなければならない問題があります。ここで使わなければならない理由がわかりませんthis。あざけるという文脈で doSomething = -> this.iWantToBeMocked()との違いを誰かに説明してもらいたいです。doSomething = -> iWantToBeMocked()

4

1 に答える 1

1

あなたのprodオブジェクトには、 という名前のオブジェクトが2 つiWantToBeMockedあります。1 つ目は、元のアラートの関数を含む変数です。2 番目は、返されたオブジェクトに含まれています。

var iWantToBeMocked 内部root.prodプライベート変数です。を設定root.prod.iWantToBeMockedすると、返される関数が変更されますが、プライベート メンバーには触れていません。

さて、使うときは

doSomething = -> this.iWantToBeMocked()

doSomethingthisは、たまたま であるコンテキストにアタッチされたメソッドを探すので、 privateroot.prodを呼び出す代わりに を呼び出します。 iWantToBeMockedroot.prod.iWantToBeMocked

于 2013-07-02T18:56:06.303 に答える