2008-12-03 19 views
5

Yakutta, tanımlandıktan sonra bir değişken veya sabitin "undefine" edilmesi için bir yol var mı? TESTING, DEVELOPMENT veya PRODUCTION: Bizim raylar environemnts iseBir değişkeni ruby ​​cinsinden tanımlamak mümkün mü?

, üç Contants biri ortamına bağlı olarak true olmak tanımlar. Daha sonra, denetleyici kodunda, hangi ortamda olduğumuzu görmek için defined? kullanıyoruz, örneğin: defined? PRODUCTION.

Şimdi, o ortama özgü davranış bazı birim testi istiyorum. İlk denemem, testimde uygun sabiti ayarlamak ve daha sonra bunları teardown ile sıfırlamaktı. Ancak, ben DEVELOPMENT sıfırlamak ve PRODUCTION böyle defined? o döner sahte anlamaya olamaz.

Açıkçası, bir çözüm sadece uygun sabiti de onu tanımlanan olmadığını kontrol ek olarak gerçek olup olmadığını görmek için kontrol etmek olurdu, ama bu mevcut kod adil bir miktar dokunmak zorunda sonuçlanacaktır.

DÜZENLEME: Bu kesinlikle şeyler yapmak için doğru yol değildir biliyoruz. Ne yazık ki, onu değiştirmek basit olmayan bir görev, bu yüzden şimdi orada olanı test etmek için kolay bir yol arıyorum. Ayrıca, sadece bir değişken/sabitin tanımlanmasının mümkün olup olmadığının alt düzeydeki dil sorusunu merak ediyorum.

cevap

8

this answer

Object.send(:remove_const, "TESTING") 

Doğru hatırlıyorsam, send kullanmak kesmek gibidir, çünkü remove_const gerçekten özel bir yöntemdir. Kendilerine, neden karşılıklı olarak tek tek olmalarına rağmen, ÜRETİM, KALKINMA ve TESTİ sabitlerini tanımlamanız gerektiğini kendinize sormak istersiniz; Bu yüzden grepsedawk'in cevabını destekledim.

+0

Bu benim, hacky ya da değil arıyordu tam olarak ne (o en birim test kodu, bu yüzden özel olduğunu korkunç endişeli değilim). Teşekkürler! –

1

yerine her sabit kontrol etme gereğini neden böyle bir şey yapamaz:

environment = :TESTING 

if(environment == :TESTING) 
3

Bu birbirini dışlayan koşullar için üç doğru/yanlış değişkenler kullanmak için biraz mantıklı. Örneğin, hem KALKINMA hem de ÜRETİM aynı anda ayarlanmışsa ne olur.

Bunun yerine, sette ( DEV, TEST, PROD) ya da benzer bir şey birine ENVIRON ayarlayarak, sen geldin hangi ortam belirten tek bir değişken var.

Sonra sadece Gerçekleştirmek istediğiniz her eylem için üç birine ENVIRON karşılaştırabilirsiniz. Bu biz burada Raylar bahsediyoruz ... ortam zaten gayet eserler böyle bir şey yaptığını RAILS_ENV saklanır RubyOnRails ile etiketlenmiş çünkü

5

Eh ...

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

I tahmin ediyorum Ayrıca böyle yazabilirim sanırım: buldum

RAILS_ENV.include?("development") 
İlgili konular