2013-05-08 46 views
0

我有一个状态机在JS(简化)有一个初始状态,只有在任何事情发生之前设置。什么是暴露私人javascript vars测试的最肮脏的方式?

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)做别的事情完全是我没有想到的?

您的想法和建议表示赞赏。

+0

为什么不添加'exports.reset = function(){state ='initial'; };'? – Goodwine 2013-05-08 16:39:18

+0

这是一个选项,但与其他选项一样,它允许在生产环境中应该只读时访问私有变量。 – 2013-05-08 16:45:10

回答

0

一般答案:测试组件的更好方法是在测试代码内部放置测试代码。当然,如果你的语言不能以一种干净的方式支持(比如D),那么这会变得很脏。

在你的情况我建议第二种方式(我的意思是你的选项B),因为它不公开的私人数据,除非明确需要(仅在测试):

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

这里没有很多关于如何运行测试的背景知识。

大多数测试跑步者有可用于安装和拆卸运行他们的名字暗示beforeEach()beforeAll()afterEach()afterAll()方法。

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

相关问题