2016-10-25 7 views
2

아주 간단한 질문 (오류 "HASH 심판으로 문자열을 사용할 수 없습니다") Can't use string ("MyApp::Model::Foo") as a HASH ref while "strict refs" in use at reader MyApp::Model::Foo::firstname 오류가 발생합니다. 어떻게 사용해야합니까?무스 접근은

너무 광범위하므로 테스트 스크립트를 실행할 때까지 테스트 스크립트를 실행하기 전에 Catalyst 응용 프로그램을로드하고 (따라서 Catalyst 구성 파일을 읽는) 설치 스크립트를 호출하고 배포 데이터베이스 테이블 등 채우십시오.

테스트 스크립트는 원래 버전에서 제대로 작동했습니다 (설정 파일에서 값을 가져 오지 않았으므로 그 값은 원래 값으로 전달되었습니다). 및 관련 비트를 사용하면 단위 테스트, 아니면 통합 테스트 종류-의를하고 싶어하고, 요 있는지 확인 단순히 나타납니다

my $name_check = MyApp::Model::Foo->check_name(); 
ok(defined $name_check, "Name is OK"); 
+1

테스트 스크립트를 포함하십시오. 'check_name'이 맞습니다. 뭔가 다른 것이 틀림 없습니다. – simbabque

+1

당신은'check_name()'을 객체 메쏘드가 아닌 클래스 메쏘드로 호출하는 것처럼 보입니다. 그러나'check_name()'호출을 보지 않고서는 우리는 확신 할 수 없다. 'check_name()'을 호출하는 코드를 추가하려면 [질문 편집] (http://stackoverflow.com/posts/40243560/edit)을 누르십시오. –

+1

나는 그것도 생각하고 있었지만, _config 파일에서 무슨 일이 일어나고 있는지도 생각할 수있다. 테스트 스크립트에서 ConfigLoader 플러그인 @Dave가 없으므로. – simbabque

답변

3

입니다 ur 응용 프로그램이 구성 파일에서 올바른 데이터를 가져 오는 중입니다.

Catalyst 구성 요소 (모델, 뷰 및 컨트롤러)는 무스 오브젝트입니다. 그들에게 무스 마술 (마법 같은 것은 아닙니다)을 갖기 위해, 당신은 그것들을 인스턴스화해야합니다. 접근자를 클래스 메서드로 호출 할 수는 없습니다. 지금 당신은 모델 객체의 새로운 인스턴스를 가지고 있기 때문에

use MyApp::Model::Foo; 
my $name_check = MyApp::Model::Foo->new->check_name(); 

는하지만이 작동하지 않을 것입니다, 그리고 그것은 설정을 통해 설정 한 이름을 가지고 있지 않습니다.

Catalyst는 구성을 포함하여 내부적으로 개체 생성을 담당합니다. 촉매제가 작동한다고 했잖아요. Catalyst::Test을 사용하여 컨텍스트 개체 $c을 얻은 다음 model 접근자를 사용하여 구성이 주어진 모델 개체의 올바른 종류를 얻을 수 있습니다.

ctx_request 함수를 사용하면 Catalyst가 요청을 처리하고 실제 HTTP::Response 객체와 컨텍스트 객체를 반환 할 수 있습니다. 그런 다음 해당 컨텍스트에서 작업 할 수 있습니다.

use Catalyst::Test 'MyApp'; 
use Test::More; 

my ($res, $c) = ctx_request('/'); 
ok defined $c->model('Foo')->name, 'Name is defined'; 

아마 Catalyst : Test를 이미 테스트 스택에 가지고있을 것입니다. 그렇지 않다면 이상한 행동을하고있는 것입니다.

특정 사용자에게 연결된 세션을 원할 경우 작동하지 않으므로 Test::WWW::Mechanize::Catalyst 또는 세션 쿠키가있는 다른 사용자 에이전트가있는 경우 쿠키를 추출하고 직접 만들어야합니다 HTTP::Request 개체를 사용하는 경우 사용자 에이전트 쿠키 병을 사용하여 쿠키를 해당 요청에 넣은 다음 ctx_request에 전달하십시오.

구성 판독을 수행하는 코드를 작성하지 않는 한 수행중인 테스트는별로 유용하지 않습니다. 그런 다음에도 전체 실행 Catalyst가 필요하지 않은 단위 테스트를 작성할 수 있습니다.

+0

그냥 고쳐주세요 @Dave;) – simbabque

+1

매우 상세한 답변을 보내 주셔서 감사합니다. 테스트 스위트는 ctx_request를 사용하여 실제로 이미 설정되었습니다. 하지만 대부분의 테스트는 Catalyst를 통해 호출되지 않았고, 즉 Catalyst 마법을 사용하지 않았기 때문에 모듈 이름을'MyApp :: Model :: Foo'로 지정했습니다. 이 경우 모든 Cat 내부를 사용해야하므로 간단히'my $ name_check = $ c-> model ('Foo') -> check_name()'호출을 변경하면됩니다. – user1235777

+0

@ user1235777 실제 단위 테스트를 원한다면 자신 만의 객체를 만드는 것이 좋습니다. 모델과 어쩌면보기에 적합합니다. 컨트롤러의 경우, 응답자 없이도 제대로 작동하려면 컨텍스트에서 많은 부분을 의지한다고 생각합니다. 그렇다면 리팩토링하는 것이 좋은 이유입니다. 대부분 테스트 스위트에 대한 특정 테스트 구성을 가지고 있습니다. 로컬 접미사를 사용하고 테스트 러너에서 ENV 변수를 설정하는 것은 매우 깔끔합니다. 그렇기 때문에 Catalyst가 값을 설정했는지 확인하기위한 테스트를 권장하지 않습니다. 그것은 어쨌든했다면 괜찮을 것입니다. :) – simbabque