SORU
5 Mart 2011, CUMARTESİ


Nasıl rspec içinde Raylar 3.1 motor kontrol testi yazacağım?

Ad Mesaj Rails 3.1 motoru yazdım. Dolayısıyla, benim denetleyicileri app/models/, modellerimi app/ kontrolörleri/Mesajlar/Mesaj, vb bulunur. Modeller gayet iyi test edebilirim. Bir model için spec... gibi görünüyor

module Posts
  describe Post do
    describe 'Associations' do
      it ...
      end

... ve her şey gayet iyi çalışıyor.

Ancak, denetleyicileri için gözlük çalışmıyor. Raylar motor /posts monte edilmiştir, henüz denetleyicisi Mesaj::PostController. Böylece, test denetleyicisi yol için Mesajlar/Mesaj olacak.

  describe "GET index" do
    it "assigns all posts as @posts" do
      Posts::Post.stub(:all) { [mock_post] }
       get :index
       assigns(:posts).should eq([mock_post])
    end
  end

veren...

  1) Posts::PostsController GET index assigns all posts as @posts
     Failure/Error: get :index
     ActionController::RoutingError:
     No route matches {:controller=>"posts/posts"}
     # ./spec/controllers/posts/posts_controller_spec.rb:16

Test uygulama yolları, dosya hileler her türlü denedim... :ad, boşuna, vb.

Bu nasıl iş yapabilirim? Motor /mesaj at denetleyicisi koyar, henüz namespacing /mesaj at denetleyicisi koyduğundan değil, test amaçlı/mesajlar kazandı gibi görünüyor.

CEVAP
29 NİSAN 2011, Cuma


enginex tarafından oluşturulan gibi kukla bir rails uygulaması ile motoru test etmek, farz ediyorum.

Motoru kukla app monte edilmelidir:

spec/dummy/config/routes.rb:

Dummy::Application.routes.draw do
  mount Posts::Engine => '/posts-prefix'
end

İkinci varsayımım, motoru izole olmasıdır:

lib/posts.rb:

module Posts
  class Engine < Rails::Engine
    isolate_namespace Posts
  end
end

Eğer bu iki varsayım gerçekten gerekli olup olmadığını bilmiyorum, ama bu benim kendi motoru yapılandırılmıştır.

Çözüm oldukça basit, bu yerine

get :show, :id => 1

bu kullanın

get :show, {:id => 1, :use_route => :posts}

:posts sembol motoru adını ve monte edildiği yolu olmalı.

Bu çalışır çünkü get metodu parametreleri geçti düz ActionDispatch::Routing::RouteSet::Generator#initialize (tanımlı here), hangi sırayla kullanır @named_route almak için doğru rota Rack::Mount::RouteSet#generate (here here).

Raylar iç içine dalan eğlenceli, ama oldukça zaman alıcı, bu her gün yaptığım bir şey değil ;-) .

HTH

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • KliptOut KwazeeKilla

    KliptOut Kwa

    24 ŞUBAT 2010
  • Strata1000

    Strata1000

    28 EYLÜL 2009
  • The Brister

    The Brister

    10 ŞUBAT 2008