2013-03-28 3 views
0

레일즈 앱에서 재미있는 일을하고 있습니다. 정보를 읽으려고 다른 DB에 연결했는데 쓰지 않았습니다. 이러한 연결을 쉽게하기 위해 필자는 테이블을 처리 할 수있는 모델을 작성했습니다. 내가 지금 여기에 걸쳐 요점을 파악하는 하나의, 두 개의 유사한 클래스를 가지고 :이 연결이 레일 응용 프로그램의 DB의 주요 연결을 무시하지 않으RSpec에서 오류를 테스트하는 테스트가 발생했습니다. ActiveRecord connection

# call.rb 
class Call < ActiveRecord::Base 
    # We don't want to change these values in the table, only read them 
    attr_reader :uniqueid, :queue, :agent_id, :codes, :code_count 

    def self.connect 
    establish_connection "ihs" 
    self.table_name = 'calls' 
    end 

    def self.disconnect 
    self.connection.close 
    end 
end 

, 그것은 단지 일시적인 것입니다. 이제는 이러한 연결을 실제로 호출하고 이러한 메서드를 호출 할 때마다 연결을 테스트하려고합니다. 지금이 순간이 내가 생각 한 것입니다 : 나는 begin ... rescue Exception => e; puts e.class; end가 발생한 예외의 종류를 확인하기 위해 사용하여이 코드를 테스트 한

# call_spec.rb 
describe Call do 

    [code omitted] 

    describe "#connect" do 
    # before { Call.disconnect } 

    it "establishes a connection to IHS DB" do 
     puts Call.count 
     lambda { Call.count }.should raise_error(ActiveRecord::StatementInvalid) 
     Call.connect 
     lambda { Call.count }.should_not raise_error 
    end 
    end 
end 

, 그것은 참으로 액티브 :: StatementInvalid 예외이지만,이 테스트가 통과하지 못했습니다. 다음과 같이 내가 던진되고있어 오류가 읽

Failure/Error: puts Call.count 
    ActiveRecord::StatementInvalid: 
    PG::Error: ERROR: relation "calls" does not exist 
     [rest omitted] 

이것은 내가 얻을 것으로 예상하고있어 오류입니다, 난 그냥 통과하기 위해 테스트를 조정할 방법을 모르겠어요. 어떤 팁?

+0

두 가지 사실을 알아 차 렸습니다. 먼저 실제 예외가 발생하기 직전에 'Call.count'를 호출하는 것이 디버깅 목적 일뿐입니다. 왜냐하면 t가 아니라면, 예외를 던질 수도 있고, 왜''{// expect_}를 raise_error로 사용하지 않을까? '를 보라. https://www.relishapp.com/rspec/rspec-expectations/v/2를 보라. -6/docs/built-in-matchers/raise-error-matcher? – pjam

+0

하하하. 그게 내 앞에서 옳았다는 것을 믿을 수 없어. 정말 고마워! 대답을 남겨두면 바로 받아 들일 것입니다! –

+0

Ok, 고마워요 :) – pjam

답변

0

호출

puts Call.count 

바로 실제 예외 전에, RSpec에 '캐치'그 전에 오류를 제기된다.

+0

댓글에서 두 번째 질문에 대답하기 위해 나는 람다 구문이 다른 테스트의 형식을보다 밀접하게 반영하도록했습니다 (to 및 no_to 대신 should 및 should_not 사용).). 조금 더 잘 읽는 것 같았습니다. –

+0

확인, 공정한만큼, 나는 단지 호기심이었다 :) – pjam

0

명시 적으로 연결하고 연결을 끊는 것이 중요한 이유가 궁금합니다.

class IhsActiveRecord < ActiveRecord::Base 
    self.abstract_class = true 
    establish_connection "#{Rails.env}_ihs" 
end 

당신이하지 않은이 방법 : 내가 읽을 수있는 보조 데이터베이스에 연결하려면 하나의 응용 프로그램에서, 나는 모든 액티브 클래스는 연결을 담당 기본 클래스에서 이런 일을 상속 한 끊임없이 다시 연결 및 연결 해제 할 수 있으며 연결 논리를 한 곳에서 유지할 수 있습니다. 실제 연결 정보는 여전히 database.yml 파일에있을 수 있습니다. 위에서 환경마다 별도의 데이터베이스가 하나 있는데, database.yml과 일치하는 한 조정할 수 있습니다.

람다 대신 스펙 {expect}을 사용하는 것이 좋습니다.

+0

응답을 보내 주셔서 감사합니다! 나는이 방법으로 연결을 시도 했었고,베이스 연결을 엉망으로 만드는 것처럼 보였으므로 (DB에 Rails 응용 프로그램이 사용하고 있었다) 다른 접근 방식을 시도했다. 또한이 DB는 어떤 방식 으로든 업데이트하지 않고 정보를 가져와야하는 DB이므로 꼭 필요한 경우에만 액세스 할 수 있도록하고 싶습니다. 그 말이 맞습니까? 아니면 마크를 아직 놓치고 있습니까? –

+0

적어도 일부 데이터베이스는 연결될 때 큰 성능을 발휘하므로 그 일을 피하려고합니다. 여기서 모델을 재 작성하는 것에 대한 의견은 http://apidock.com/rails/ActiveRecord/Base/readonly%3F에서 볼 수 있으며, 자신의 빈 '삭제'및 '삭제'메소드 또는 인상하는 버전을 정의 할 수도 있습니다 예외. – sockmonk

+0

포인터를 가져 주셔서 감사합니다! 방금 그 방법을 구현하는 것을 마쳤으며 이제 전체 모델에 대해 훨씬 더 안전하게 생각합니다. –

관련 문제