Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/403.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
公开私有javascript变量进行测试的最不肮脏的方式是什么?_Javascript_Unit Testing_Scope_Private - Fatal编程技术网

公开私有javascript变量进行测试的最不肮脏的方式是什么?

公开私有javascript变量进行测试的最不肮脏的方式是什么?,javascript,unit-testing,scope,private,Javascript,Unit Testing,Scope,Private,我在JS中有一个状态机(为了简化),它有一个初始状态,只有在发生任何事情之前才设置 define(function() { var state = 'initial', exports = {}; exports.getState = function() { return state; }; exports.doSomething = function() { state = 'newState'; }; return exports;

我在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是应用程序前缀,xxTests仅定义为测试运行程序的一部分)

c) 做一些我完全没有想到的事情


非常感谢您的想法和建议。

一般回答:在不公开私有数据的情况下测试组件的更好方法是将测试代码放入该组件中。当然,如果您的语言不以干净的方式支持这一点(就像D一样),这将变得非常肮脏

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


关于如何运行测试,没有太多上下文

大多数测试运行程序都有
beforeach()
beforeAll()
afterEach()
,以及
aftereall()
方法,这些方法可用于按照名称运行的设置和拆卸


为了解决您的特定问题,我不会在更改您的“状态机”代码,而是在
beforeach()
函数中创建一个新的状态机,以便每个测试都获得状态设置为“initial”的新函数对象。

为什么不添加
exports.reset=function(){state='initial';}?这是一个选项,但与其他选项一样,它允许在生产环境中以只读方式对私有var进行写访问。
if(youAreDoingATest)
{
    exports.reset=function() { state='initial'; };
}