2011-11-29 12 views
7

Ben twitter gem kullanarak bir test uygulaması yazıyorum ve bir entegrasyon testi yazmak istiyorum ama Twitter isim alanında nesneleri alay etmek nasıl anlayamıyorum.Bir üçüncü taraf nesnesini ruby ​​ile alaylamanın en iyi yolu nedir?

1) testing oauth twitter 
    Failure/Error: login_with_oauth 
    Twitter::Error::Unauthorized: 
    GET https://api.twitter.com/1/account/verify_credentials.json: 401: Invalid/expired Token 
    # ./app/models/user.rb:40:in `build_twitter' 
    # ./app/models/user.rb:16:in `build_authentication' 
    # ./app/controllers/authentications_controller.rb:47:in `create' 
    # ./spec/support/integration_spec_helper.rb:3:in `login_with_oauth' 
    # ./spec/integration/twit_test.rb:16:in `block (2 levels) in <top (required)>' 
: Bu hatayı alıyorum,

feature 'testing oauth' do 
    before(:each) do 
    @twitter = double("Twitter") 
    @twitter.stub!(:configure).and_return true 
    @client = double("Twitter::Client") 
    @client.stub!(:current_user).and_return(@user) 
    @user = double("Twitter::User") 
    @user.stub!(:name).and_return("Tester") 
    end 

    scenario 'twitter' do 

    visit root_path 
    login_with_oauth 

    page.should have_content("Pages#home") 
    end 
end 

Ama: İşte testine istediğiniz işlev var:

def build_twitter(omniauth) 
    Twitter.configure do |config| 
    config.consumer_key = TWITTER_KEY 
    config.consumer_secret = TWITTER_SECRET 
    config.oauth_token = omniauth['credentials']['token'] 
    config.oauth_token_secret = omniauth['credentials']['secret'] 
    end 
    client = Twitter::Client.new 
    user = client.current_user 
    self.name = user.name 
end 

ve burada yazmaya çalışıyorum RSpec testi var

Yukarıdaki alaylar rspec kullanıyor ama ben de mocha'yı denemeye açığım. Herhangi bir yardım büyük takdir edilecektir.

Tamam, bunu herkesin yardımı sayesinde çözmeyi başardım. İşte son test var:

feature 'testing oauth' do 
    before(:each) do 
    @client = double("Twitter::Client") 
    @user = double("Twitter::User") 
    Twitter.stub!(:configure).and_return true 
    Twitter::Client.stub!(:new).and_return(@client) 
    @client.stub!(:current_user).and_return(@user) 
    @user.stub!(:name).and_return("Tester") 
    end 

    scenario 'twitter' do 

    visit root_path 
    login_with_oauth 

    page.should have_content("Pages#home") 
    end 
end 

hüner gerçek nesneler üzerinde :configure ve :new saplama için gerekli ve bir dobuled nesne örneği :current_user ve :name saplama olduğunu bulmaktan.

cevap

4

Sanırım sorun sadece alay'ı kullanma şeklinizdir, mock @twitter'i yarattınız, ama aslında onu hiç kullanmıyorsunuz. Twitter'a yapılan herhangi bir çağrının belirttiğiniz stubbed yöntemlerini kullanacağı izlenimi uyandırıyor olabilirsiniz, ancak bu nasıl işe yaramıyorsa, sadece @twitter için yapılan çağrılar engellenir.

Çift yakut, RSpec değil mocks kullanın, ancak sana artık şöyle bir şey yapmak istiyorum inanıyoruz:

Bu zaman sen Twitter'da stubbed yöntemleri, Heyecan :: Müşteri denir olmasını sağlar
Twitter.stub!(:configure).and_return true 
... 
Twitter::Client.stub!(:current_user).and_return @user 

, Nasıl istersen cevap verirler.

Ayrıca, bir şeyin bir parçası olarak test edilmesinin garip gelmesi, gerçekten bir denetleyici sınamasının bir parçası olmamam gerekiyordu.

+0

Evet! Teşekkür ederim. Modelde bir yöntem saplama ve iki katına çıkan bir örneği saplama arasındaki farkı kaçırdığımdan kesinlikle haklısınız. Bu sayede bunu anlayabildim. Sonunda bunu nasıl çözdüğümü dahil etmek için soruyu düzenleyeceğim. – spinlock

İlgili konular