2016-03-22 10 views
0

Bazılarınızın, aklımı bu konuda şüphe duyduğunu biliyorum. Sahip olduğu bir JSON özniteliğinin içinde kazmak için eksik yöntemi kullanan bir ActiveRecord sınıfım var.Raylar/Rspec yanıtı_bir metod_yatırma arayışı

# app/models/request_interactor.rb 

    ... 

    def method_missing(method_sym, *arguments, &block) 
    return self.request_params[method_sym.to_s] if self.request_params[method_sym.to_s] 
    super 
    end 

testi ben test içindeki bağlayıcı denedim bu

before(:each) do 
    @ri = RequestInteractor.create(result: {magic_school: true, magic_learnt: 'all things magical'}, request_params: {application_id: 34, school_id: 20, school_name: 'Hogwarts', course_name: 'Defence against the Dark Arts.'}) 
end 

it 'should respond to attributes set in the request parameters' do 
    expect(@ri).to respond_to(:school_name) 
    expect(@ri.school_name).to eq('Hogwarts') 
end 

, @ri.school_name'Hogwarts' eq olacak gibi görünüyor, ama responds_to çalıştırılırken böyle bir yöntem yoktur söyleyerek başarısız olur! Kirli, kirli yalancı!

ben modelinde böyle bir şey yaptığını çalıştı:

def respond_to?(method, include_private = false) 
    super || self.respond_to?(method, include_private) 
end 

Ama bu yüzden şimdi benim gün kaderi olduğunu .. çünkü ya yinelenen, çünkü ya yinelenen, çok derin bir yığın seviyesini geri döner sizin eller! Aydınlat beni Eksik olan yönteme yanıtı nasıl test ederim.

cevap

2

respond_to_missing'u kullanın. Daha fazla bilgi here.

Şimdi, bütün bunlar söylendi. Bana sorarsan desenin hala hack görünecek. Bu arada tonlarca bu temizlemek için

Refactors

Yakut vardır.

  1. bir heyet düzeninin

    delegate :method_name, :to => :request_params

    kullan (doc diğer seçenekleri kontrol edin). Bu, sizin nesnenizde bir metot oluşturarak problemlerinizi çözmelidir, böylece respond_to? çalışacak ve method_missing'u geçersiz kılmayacaksınız.

  2. request_params ayarlarını yaparken erişim yöntemlerinizi oluşturun (erişimcilerinizin meta-programlanması).

  3. request_params gibi bir Hash ile başlatılamayacağından, OpenStruct kullanın. Üstte temsilci eklerseniz, havalı olmalısınız.

Bu yardımcı olur umarım.

+0

Hey @muichkine Önerileriniz için teşekkürler, temsilci desenini kullanmayı düşünmedim, gerçekten beğendim! Kullanmakta olduğum tek rezervasyon, 'request_params'ın bir JSON nesnesi olmasıdır, bu yüzden bu bir karma değeriymiş gibi erişmelidir. Bu yüzden belki de yöntem eksik bırakılır ve ardından yanıt için bir kanca sağlamak üzere temsilci deseni kullanılır. İstek paramları, nesneye önceden atanmış olarak ayarlanmış ve RI nesnesi sadece çok daha sonra kaydedildi, bu yüzden erişimcileri metalamak için bir 'before_save' filtresi kullanmam gerekiyordu. En iyi gibi göründüğü delegasyon desenini deneyeyim :) TY – TheLegend

İlgili konular