2013-07-15 3 views
0

기본적으로 두 모델 A와 B를 생성하고 B가 A에 속한 B와 B 사이의 연결을 설정하고 A를 반환하는 서비스 객체 (http://railscasts.com/episodes/398-service-objects)를 생성했습니다. via a 협회를 통해).테스트 용 유효하지 않은 모델 반환

오류가 발생하면 오류 정보와 함께 해시를 반환합니다. 이 메서드를 테스트하려고 할 때 모델 반환 여부 또는 오류 정보가 포함 된 해시 중 하나가 가능한 두 가지 반환 유형이있는 곳에 문제가 발생했습니다.

이것은 설계가 잘못되었다는 신호입니까? 나는 당신이 첫번째로 시험 할 때 (TDD) 당신이 그런 디자인 문제들을 피하는 것을 안다.

문제가있는 경우 잘못된 A 모델을 반환해야한다는 것을 알고 있습니다. 모델 B가 생성시 오류가 발생한다고 가정하면 잘못된 A 모델을 어떻게 계속 반환 할 수 있습니까?

오류 해시를 반환해도 문제가없는 경우이 메서드를 어떻게 테스트하여 친숙하게 테스트 할 수 있습니까?

답변

1

좋은 통찰력과 좋은 질문입니다. :-) 그것의 얼굴에, 이것은 "오류"사건에 대한 Ruby 예외를 발생시키는 대신 좋은 방법 인 것처럼 보이며, 메서드 호출의 결과로 해시로 반환하는 것이 아닙니다. 자신의 오류 클래스 (아마도 StandardError의 하위 클래스 여야 함)를 정의하고 발생한 오류의 일부로 원하는 해시 또는 정보를 포함 할 수 있습니다. 이 일반적인 주제에 대한 설명은 http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_exceptions.html을 참조하십시오.

rspec에서 오류가 발생했는지 확인하는 방법은 How to use RSpec's should_raise with any kind of exception?의 마지막 답변과 추가 정보에 대한 링크를 참조하십시오.

API를 RESTful 인터페이스로 제공하려는 경우 How to handle REST Exceptions?에서 논의 된 것처럼 HTTP 응답 코드를 사용하여 예외를 제시하는 것으로 보입니다. 예외 응답 코드 (예 : 40X)를 예외를 제시하면, 그 경우 해시를 리턴한다는 사실과 다른 경우의 모델을 반환한다는 것은 나쁜 냄새가 아닙니다. 즉, 오류가있는 데이터와이 오류를 수반하는 데이터 사이의 일관성에 대한 기대가 없으므로 성공적인 반환. 어쨌든 나는 오류 상황에서 "유효하지 않은"모델을 반환하는 것이 실제로 생각할 수 없다고 가정합니다. 실제로 그 상황에서 모델을 생성하거나 유지하지는 않는다고 가정합니다.

+0

답변 해 주셔서 감사합니다. API를 작성 중이므로 JSON에서 오류를 정상적으로 반환해야하므로 Ruby 예외/오류를 발생시킬 여유가 없습니다. 이 경우 무엇을 제안 하시겠습니까? – darksky

+0

업데이트 된 답변의 마지막 단락을 참조하십시오. –

+0

예 컨트롤러에서 이미 그렇게했습니다. 내 서비스는 유효한 모델 (컨트롤러가 정상적으로 계속됨) 또는 오류를 나타내는 해시 (이 경우 HTTP 응답 코드 오류 발생 등)를 반환합니다. 이 경우 내 서비스가 해시 또는 유효한 모델을 반환하는 것이 좋을지, 아니면 잘못된 모델을 반환 할 수 있는지 확인해야합니까? 모델 B가 유효하지 않은 경우 (B에 대한 위의 질문을 다시보십시오)? – darksky

0

결과의 유형을 테스트 할 수 있습니다. RSpec에에서

...

expect(actual).to be_an_instance_of(expected) 
expect(actual).to be_a_kind_of(expected) 
+0

예, 알고 있습니다. 이것이 잘못 설계된 표지가 아니겠습니까? – darksky

관련 문제