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

  • 07cadikiz07

    07cadikiz07

    17 EKİM 2007
  • Sparta Spartanutul

    Sparta Spart

    18 HAZİRAN 2013
  • YouChewBu

    YouChewBu

    26 Ocak 2009