2011-07-05 3 views
4

엔진 개발과 테스트 용 더미 응용 프로그램에 대한 기사가 많이 있습니다.RSpec을 사용하여 실제 앱에 대한 Rails3 엔진을 개발하는 방법은 무엇입니까?

여기서는 독립 실행 형 엔티티가 아니지만 실제 Rails 3 응용 프로그램에 종속 된 엔진을 개발 중입니다. 엔진의 작업은 자체 테이블과 모델 매핑이있는 레거시 시스템에서 데이터를 가져 오는 것이므로 우리는 여전히이 코드를 엔진에 저장하고 앱에 포함시키지 않기를 원하며 결국에는 다시 제거하려고합니다.

기존 레거시 테이블과 새 스키마 간의 데이터 매핑이 복잡하므로 엔진을 TDD (rspec 사용)해야합니다.

  • 나는 enginex gem을 사용하여 Jose Valim's book "Crafting Rails Appliations"을 따라갔습니다.
  • /spec/dummy_app을 실제 Rails 3 앱을 가리키는 자식 서브 모듈로 바꿨습니다.
  • 실제 앱의 Gemfile이 엔진을 가리 키지 않고 엔진을 요구하기 위해 config/application.rb을 수정할 수 없기 때문에 엔진에서 모델을로드하는 데 문제가 있습니다 (정의되지 않은 심볼 오류). 이 책의 15-16 페이지에 설명 된대로 더미 응용 프로그램이 수행합니다.)
  • 부하 경로 $:lib 폴더가 포함되어 있고 경로는 spec_helper입니다.
  • requirespec_helper.rb에 두어도 문제가 해결되지 않았습니다.
  • 실제 앱의 부팅 순서에 연결하여 실제 앱 코드를 수정하지 않고 엔진이 필요하도록 내부 레일 API (또는 영리한 원숭이 패치)가 있는지 궁금합니다 (하위 모듈에 있음).).
  • 또 다른 이슈는 제가 2 개의 젬 파일 (엔진과 엔진 중 하나)을 가지고 있으며, 엔진이 활성화되면 둘 다 사용해야한다는 것입니다.

생각들?

답변

8

그래서 나는 몇 가지를 알아 냈고, 이제는 제대로 작동하도록 만들었습니다. 편의상

, 나는 "my_gem"와 "MyGem"로 내 보석의 이름을 참조거야 다음 engine.rb 파일에서

, 나는 추가 :

require 'my_gem' 
require 'rails' 

이 고정 오류 유형 :

my_gem/lib/my_gem/engine.rb:2: uninitialized constant MyGem::Rails (NameError) 

spec_helper.rb, 나는 바로 위에 추가 :

require 'bundler/setup' 
require 'my_gem' 

이것은 Bundler가 앱을 통하지 않고 즉시 초기화되었는지 확인하기위한 것입니다. 그렇게하면 MyGem을 여기로드 할 수 있으며 앱의 초기화 시퀀스에 연결됩니다. 엔진의 모델 클래스에 대한 NameError 예외가 수정되었습니다.

그게 무슨 Gemfile의 질문을 떠납니다. 문제는 내 앱이 자체 gemfile을 가지고 있고 보석/엔진이 자체적으로 별도의 의존성을 필요로한다는 것입니다. Gemfile.

Bundler가 두 개의 Gemfile을 전달하는 API를 찾을 수 없습니다. 사실 Bundler는 하나의 신뢰할 수있는 Gemfile을 전제로 제작 된 것으로 보입니다. 그래서 나는 spec_helper에 하나를 생성합니다. 나는 앱의 gemfile을 가져다가 gemspec을 붙이면 GemSpec 형식의 보석 의존성을 가리킨다. (힌트 약 gemspec은 호세 발림의 책에서 그런데 누락되었습니다.)

테스트 시작 중에 파일을 연결하는 것보다 더 좋은 방법이 있는지 모르겠습니다. 그 중 하나를 알고 있다면 응답하십시오.

유용한 자원했다 :

예후 다 카츠에 의해
관련 문제