0

我在 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) 做一些我完全没想到的事情?

感谢您的想法和建议。

4

2 回答 2

0

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

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

if(youAreDoingATest)
{
    exports.reset=function() { state='initial'; };
}
于 2013-05-08T16:42:26.237 回答
0

关于如何运行测试的上下文并不多。

大多数测试运行程序都有beforeEach()beforeAll()afterEach()afterAll()可用于设置和拆卸的方法,这些方法如其名称所暗示的那样运行。

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

于 2015-05-29T23:34:47.343 回答