1

다른 곳에서 이런 종류의 표기법을 보았습니다 : @user = FactoryGirl.create(:user),이 인스턴스 변수가 어떻게 동작하는지 정확하게 알 수 없습니다.팩토리 소녀가 만드는 영구 데이터에 인스턴스 변수를 할당하는 동작

특히이 인스턴스 변수의 동작에 대해 궁금합니다. 예를 들어, 현재 RSpec에서 통합 테스트를 만들고 있습니다. (예를 들어, @video.title 사용)) 나는 비디오 인스턴스의 다른 속성을 액세스하는 그 시점에서 아무런 문제가 없다

@video = FactoryGirl.create(:video, title: "Test title") 

: 테스트 중 하나에서, 내 비디오 클래스의 인스턴스에 인스턴스 변수를 할당하려 .

그러나 사용자가 양식의 "제목"필드를 지울 수 있도록 통합 테스트를 만들고 비디오가 업데이트되면 데이터베이스에서 제목이 지워집니다. 내가 인스턴스 변수를 사용하여 인스턴스에 액세스 할 때 예를 들어, 어떤 이유

click_link "Edit" 
fill_in "Title", with: "" 
click_button "Update Video" 
expect(find('#title')).to_not have_content "Test title" 

는 페이지가 표시됩니다 올바르게하지만, 변화가 발생하지 : print @video.title 반환 "Test title"

무슨 이상한 것은에 있다는 것입니다 다른 통합 테스트 비슷한 프로세스를 사용하여 비디오 인스턴스의 속성을 업데이트합니다 (예 : "업데이트 된 테스트 제목"). 그런 다음 속성이 웹 페이지에서 올바르게 업데이트되었는지 확인하기 위해 테스트했지만이 시간 인스턴스 변수도이를 반영했습니다 (print @video.title 사용).

왜 이런 경우일까요?

+3

DB로부터 레코드를 갱신하기 위해'@ video.reload.title'을 시도하십시오. –

+1

@SergiiK는 올바른 생각을 가지고 있습니다. 단순히'@ video'를 만들 때 데이터베이스 변경 사항 (비디오 객체의 정적 복사본)과의 연결이 끊어지면'reload'가 초기 할당 이후에 변경된 내용을 데이터베이스에서 새로 고쳐지게됩니다. – engineersmnky

+0

@engineersmnky, 고마워,이게 문제를 해결했다! 이 리소스에 대한 리소스가 있습니까? 또는이 문서에서 확인할 수있는 문서가 있습니까? 내 원래 게시물에서도 말할 수 있었을 지 모르지만, 내가 알아 내야 할 질문이 무엇인지 알기가 어려웠습니다. – RyanQuey

답변

0

해결책은 @video.reload.title을 사용하여 DB에서 레코드를 업데이트하는 것입니다.

@video을 만들면 데이터베이스 변경 내용 (비디오 개체의 정적 복사본) reload에서 연결이 끊어 지므로 초기 할당 이후 변경된 내용이 데이터베이스에서 새로 고쳐집니다.

자료는 다음과 같습니다

(신용 위의 의견에 질문에 대답 @SergiiK 및 @engineersmnky로 이동합니다.)