2008-12-03 36 views
5

在ruby中,有没有一种方法可以在定义变量或常量时“取消”定义?是否有可能取消定义一个变量在红宝石?

在我们的轨道environemnts,我们定义了三个contants一个是true,根据环境:TESTINGDEVELOPMENT,或PRODUCTION。然后,在控制器代码中,我们使用defined?来查看我们所处的环境,即:defined? PRODUCTION

现在,我想单元测试一些特定于环境的行为。我最初的尝试是在我的测试中设置合适的常量,然后在拆卸过程中重置它们。但是,我不知道如何重置DEVELOPMENTPRODUCTION,使defined?返回false。

显然,一个解决办法是只检查,看看是否合适的常数也此外,如果它被定义检查真实的,但是这将导致不得不触及现有的代码中有相当。

编辑:我意识到这绝对不是正确的做事方式。唉,改变它是一项不重要的任务,所以我正在寻找一种简单的方法来单元测试现在有什么。另外,我也只是对低级语言问题是否可以取消定义变量/常量感到好奇。

回答

8

我发现this answer

Object.send(:remove_const, "TESTING") 

如果我没有记错,使用send这里是怎样的一个黑客,因为remove_const是一个真正的私有方法。你想问自己,为什么你需要同时定义常量PRODUCTION,DEVELOPMENT和TESTING,而他们真的是相互排斥的;这就是为什么我高举了greulawk的答案。

+0

这正是我一直在寻找,哈克或没有(它的单元测试代码,所以我并不十分担心,它是私有的)。谢谢! – 2008-12-04 01:37:34

1

而是检查每个不变的,为什么不这样做:

environment = :TESTING 

if(environment == :TESTING) 
3

它意义不大使用三个真/假变量是相互排斥的条件。例如,如果开发和生产同时设置,会发生什么情况。

相反,有一个变量,它表明你在哪个环境,设置ENVIRON到集(DEVTESTPROD)或类似的东西之一。

然后,您可以将ENVIRON与您希望执行的每个操作的三者之一进行比较。

5

嗯,我猜,因为这是标记,我们正在谈论的Rails ......这里的环境是存储在RAILS_ENV已经这样做类似的作品就好RubyOnRails ...

if (RAILS_ENV == "production") ... 

我猜你也可以把它写这样的:

RAILS_ENV.include?("development")