暴露私有javascript vars进行测试的最不脏的方法是什么?

时间:2013-05-08 16:33:36

标签: javascript unit-testing scope private

我在JS中有一个状态机(简化)有一个初始状态,只在发生任何事情之前设置。

define(function() {
  var state = 'initial',
      exports = {};

  exports.getState = function() {
    return state;
  };

  exports.doSomething = function() {
    state = 'newState';
  };

  return exports;
});

因为在重新加载应用程序之前状态是永久性的,所以在第一次测试之后,状态将永远不会再次“初始化”,因此我需要一种方法来重置它。

这样做最不脏的方法是什么?我应该......

a)简单地将州公开,但用_?

标记为私人
define(function() {
  var exports = {};

  exports._state = 'initial'

  exports.getState = function() {
    return this.state;
  };

  exports.doSomething = function() {
    this.state = 'newState';
  };

  return exports;
});

b)通过函数使状态可写吗?

define(function() {
  var state = 'initial',
      exports = {};

  exports.getState = function() {
    return state;
  };

  exports.doSomething = function() {
    state = 'newState';
  };

  if(window.xxTests) {
    window.xxTests.Module = {
      setState: function(newState) {
        state = newState;
      }
    };
  }

  return exports;
});

(其中xx是app前缀,xxTests仅作为测试运行器的一部分定义)

c)完全不做其他事情吗?

您的意见和建议表示赞赏。

2 个答案:

答案 0 :(得分:0)

一般回答:在不暴露私有数据的情况下测试组件的更好方法是将测试代码放在该组件中。当然,如果您的语言不能以干净的方式支持(如D所做的那样),这会变得非常脏。

在您的情况下我建议采用第二种方式(我的意思是您的选项b),因为除非明确需要(仅在测试期间),否则它不会公开私有数据:

if(youAreDoingATest)
{
    exports.reset=function() { state='initial'; };
}

答案 1 :(得分:0)

关于如何运行测试的背景并不多。

大多数测试运行者都有beforeEach()beforeAll()afterEach()afterAll()方法,可以按照他们的名字建议运行设置和拆除。< / p>

要解决您的具体问题,我不会更改您的“状态机”代码,而是在beforeEach()函数中创建一个新的状态机,以便每个测试获取状态设置为的新函数对象'初始'。