【问题标题】:In Javascript/Coffeescript how can I mock out a module's public variable in a test?在 Javascript/Coffeescript 中,如何在测试中模拟出模块的公共变量?
【发布时间】:2013-07-02 23:01:04
【问题描述】:

我刚刚了解了module pattern。我已经编写了一些足够复杂的代码,以至于我想测试一个特性。问题是,我不知道如何模拟一个值。接下来是coffeescript,但我会将生成的javascript放在下面,以便获得更多帮助。这是我的测试,它试图模拟一个名为 state 的字段,但它总是打印“未定义”:

root = exports ? this
root.test3 = (->
  root.test2.state = "abc"
  root.test2.doSomething()

  return {}
)()

这里的 test2 可以被认为是生产代码:

root = exports ? this
root.test2 = (->
  state = undefined

  doSomething = -> alert state

  return {
    state: state
    doSomething: doSomething
  }
)()

这是我在其中运行的 html,但我认为这并不重要:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8"/>
    <title>TEST2</title>

    <script src="test2.js" type="text/javascript"></script>
    <script src="test3.js" type="text/javascript"></script>

    <style>
        canvas {
            border: 1px solid black;
        }
    </style>

</head>

<body>


<h1>This is a test</h1>

</body>
</html>

Javascript 中的 test2:

var root;

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

root.test2 = (function() {
  var doSomething, state;
  state = void 0;
  doSomething = function() {
    return alert(state);
  };
  return {
    state: state,
    doSomething: doSomething
  };
})();

Javascript 中的 test3:

var root;

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

root.test3 = (function() {
  root.test2.state = "abc";
  root.test2.doSomething();
  return {};
})();

正如我所说,运行此警报undefined。我希望它输出“abc”。我该怎么做?

【问题讨论】:

    标签: javascript coffeescript global-variables module-pattern


    【解决方案1】:

    你想在这种情况下使用“this”,

    doSomething = function() {
        return alert(this.state);
    };
    

    在您的代码中,“状态”指的是未定义的变量(通过闭包)。然后,您返回一个包含新“状态”属性的对象。您不需要第一个“状态”变量,只需要返回对象中的属性。

    doSomething 中的

    'this' 指的是它所属的任何对象。在 test3 中,doSomething 指的是返回的对象,其 'state' 设置为 undefined。在 test3 中设置状态后,对象的“state”属性不再与 test2 中的私有变量“state”相同——它在 test3 中被覆盖。

    本质上,你不需要模块模式来达到你想要的效果,有一个更简单的方法:

    root.test2 = {
        state: void 0,
        doSomething: function() {
            return alert(this.state);
        }
    };
    

    http://jsfiddle.net/rMJs5/

    更新::我忘记了咖啡部分:

    root = exports ? this
    root.test2 = (->
      doSomething = -> alert this.state
      return {
        state: undefined
        doSomething: doSomething
      }
    )()
    

    或者,简单地说:

    root = exports ? this
    root.test2 = {
        state: undefined
        doSomething: -> alert this.state
    }
    

    【讨论】:

    • 在 doSomething 的函数定义中...?
    • 好的,这很有帮助,但是如果我想模拟一个函数而不是一个变量怎么办?想象一下doSomething 调用了一个函数名alertABC()。我怎样才能改变 alertABC() 在 test3 中的作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    • 2019-08-26
    • 2022-01-27
    • 2022-08-11
    • 1970-01-01
    相关资源
    最近更新 更多