2012-03-13 15 views
5

'daki Class.new avantajı, şirketten ayrılan biri tarafından yazılan bazı Rspec üzerinden yazıyorum. Ben bu hat hakkında merak ediyorum:Bu Rspec

let(:mailer_class) { Class.new(AxeMailer) } 
    let(:mailer) { mailer_class.new } 

    describe '#check' do 
    before do 
     mailer_class.username 'username' 
     mailer.from '[email protected]' 
     mailer.subject 'subject' 
    end 
    subject { lambda { mailer.send(:check) } } 

Bu sınıf test ediyor:

class AxeMailer < AbstractController::Base 

    def self.controller_path 
    @controller_path ||= name.sub(/Mailer$/, '').underscore 
    end 

bu ve let(:mailer_class) { AxeMailer } arasındaki farkı bilmek istiyorum.

Bunu soruyorum çünkü şu anda testi çalıştırdığımda, name'un nil olduğunu şikayet eder. Ama eğer değiştirseydim, iyi bir test olacak.

Bu sorunun Rails 3.2'yi kullandıktan sonra başladığını düşünüyorum ve bence name, AbstractController :: Base'den devralındı.

Bu, konsoldaki (Rspec'e özgü değil) aynıdır, AxeMailer.name hata olmadan yapabilirim, ancak Class.new(AxeMailer) yaparsam sorun var demektir.

Sorularım şunlardır:

  1. Class.new(AxeMailer) Sadece bu değiştirirseniz bir problem var mı
  2. AxeMailer üzerinde kullanmak için bir neden var mı?
  3. Spesifikasyonu değiştirip geçmesini sağlamanın bir yolu var mı?
+0

Daha fazla test kodunu 'let' yöntemine ek olarak gönderir misiniz? Bu, neden bu şekilde yazıldığını belirlememize yardımcı olur. –

+0

sadece biraz eklediniz, bu yeterli olur mu? Bana – lulalala

+0

, sebep yok. – shingara

cevap

2

Tahmin ediyorum, bunun nedeni mailer_class.username 'username' satırından kaynaklanıyor. Doğrudan AxeMailer kullandıysanız, username ayarı testler arasında gerçekleştirilecektir. Her bir test için yeni bir alt sınıf oluşturarak, bunların arasında hiçbir durumun taşınmadığından emin olabilirsiniz.

+0

Bence bunun nedeni muhtemelen budur (ki bu zaten önemli değil). Bunu şu şekilde değiştirdim: '@controller_path || = parent.name.sub (/ Mailer $ /, '') .underscore 've şimdi geçmek için görünüyor – lulalala

0

mailer_class gerçek spec veya içinde değil kullanılıyorsa bilmiyorum, ama bu kurulum gibi bakmak gerektiğini düşünüyorum budur: Sadece olmak görünmüyor Orada

let(:mailer) { AxeMailer.new } 

describe '#check' do 
    before do 
    AxeMailer.username 'username' 
    mailer.from '[email protected]' 
    mailer.subject 'subject' 
    end 
    subject { lambda { mailer.send(:check) } } 

Oluşturulmakta olan anonim bir sınıfa ihtiyaç duyulmaktadır. Ayrıca, bu sadece benim görüşüm, ama senin subject biraz garip görünüyor. Spesifikasyonunuz, eğer gerekiyorsa, nesneyi bir lambda sarmalıdır, ancak bunu subject'unuzda yapmayın. Başlangıçta görüyordun hatayı İlişkin

, anonim sınıfları adları yok:

1.9.3-p0 :001 > Class.new.name 
=> nil 

ActionMailer :: Base bir kısmı şey (belki günlüğü) ve molalar için sınıf adını kullanma girişiminde gerekir Bu sıfır.

+0

Teşekkürler. 'Name'' self.controller_path' yönteminde kullanılır. 'AbstractController :: Base'' self.controller_path'ı geçersiz kılar.Bir tür “AbstractController :: Base” yi yenilemekte olduğundan, aynı zamanda çalışmalıdır (ve daha önce çalışmaktadır). – lulalala