레일즈 앱에서 재미있는 일을하고 있습니다. 정보를 읽으려고 다른 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]
이것은 내가 얻을 것으로 예상하고있어 오류입니다, 난 그냥 통과하기 위해 테스트를 조정할 방법을 모르겠어요. 어떤 팁?
두 가지 사실을 알아 차 렸습니다. 먼저 실제 예외가 발생하기 직전에 'Call.count'를 호출하는 것이 디버깅 목적 일뿐입니다. 왜냐하면 t가 아니라면, 예외를 던질 수도 있고, 왜''{// expect_}를 raise_error로 사용하지 않을까? '를 보라. https://www.relishapp.com/rspec/rspec-expectations/v/2를 보라. -6/docs/built-in-matchers/raise-error-matcher? – pjam
하하하. 그게 내 앞에서 옳았다는 것을 믿을 수 없어. 정말 고마워! 대답을 남겨두면 바로 받아 들일 것입니다! –
Ok, 고마워요 :) – pjam