在ruby中,有没有办法在变量或常量定义后“取消定义”变量或常量?
在我们的rails environemnts中,我们将三个内容之一定义为true
,具体取决于环境:TESTING
,DEVELOPMENT
或PRODUCTION
。然后,在控制器代码中,我们使用defined?
来查看我们所处的环境,即:defined? PRODUCTION
。
现在,我想对一些特定于环境的行为进行单元测试。我最初的尝试是在我的测试中设置适当的常量,然后在拆解时重置它们。但是,我无法弄清楚如何重置DEVELOPMENT
和PRODUCTION
以使defined?
返回false。
显然,解决方案是检查合适的常量是否也是真的,除了检查它是否已定义,但这将导致必须触及相当数量的现有代码。
编辑:我意识到这绝对不是正确的做事方式。唉,改变它是一项非常重要的任务,所以我正在寻找一种简单的方法来单独测试现在的情况。另外,我也很好奇关于是否有可能取消定义变量/常数的低级语言问题。
答案 0 :(得分:8)
我找到了this answer
Object.send(:remove_const, "TESTING")
如果我没记错的话,在这里使用send
就是一种破解,因为remove_const实际上是一种私有方法。你想问问自己为什么你需要在它们真正相互排斥的同时定义常量生产,开发和测试;这就是为什么我赞成grepsedawk的答案。
答案 1 :(得分:5)
我猜是因为这是用RubyOnRails标记的,我们在这里谈论Rails ......环境已经存储在RAILS_ENV中,所以做了类似的工作......
if (RAILS_ENV == "production") ...
我想你也可以这样写:
RAILS_ENV.include?("development")
答案 2 :(得分:3)
对于互斥的条件使用三个true / false变量没有多大意义。例如,如果同时设置了开发和生产,会发生什么。
相反,只需一个变量来指示您所处的环境,将ENVIRON
设置为其中一个(DEV
,TEST
,PROD
)或其他内容类似。
然后,您可以将ENVIRON
与您要执行的每个操作的三个中的一个进行比较。
答案 3 :(得分:1)
不要检查每个常量,为什么不做类似的事情:
environment = :TESTING
if(environment == :TESTING)