문제

이것은 지난 며칠 동안 나를 화나게 한 것입니다. 인증 된 사용자가 사이트에 자산을 업로드 할 수있는 조치가 있습니다. 프로세스를 수동으로 실행할 수 있으므로 컨트롤러 동작이 정확하지만 RSPEC을 사용하여 테스트하고 싶습니다.

나는 그것을 사용해야한다 request 도우미는 인증 된 세션을 재사용 할 수 있습니다. :given 이 테스트 세트.

it "should allow authenticated file uploads" do
    file = File.open(a_valid_file)
    mock_file = mock("file")
    mock_file.stub!(:path).and_return(file.path)

    request( resource(:assets), :method => "POST",
        :params => { :file => 
            {:tempfile => mock_file, :filename => File.basename(file.path)} }
    )
end

사양 내부의 중단 점은 모두 잘 작동하지만 사양을 실행하고 디버거를 통해 컨트롤러 작업의 경로에 액세스하려고 할 때 다음과 같습니다.

e file[:tempfile].path
NoMethodError Exception: undefined method `path' for "#[Spec::Mocks::Mock:0x3fda2a4736c0 @name=\"file\"]":String

내 생각에 stub!(:path) 요청을 통해 Mock 객체가 만들어지는 모든 것에 대해 설정되지 않습니다.

문제는 : 파일 업로드를 테스트하기위한 올바른 방법을 가고있는 것입니다. 다른 방법이 아니라면?

도움이 되었습니까?

해결책

나는 그것을 잘못하고 있었다. 사용하여 request 그것은 모든 매개 변수에서 to_s를 호출하고 있었기 때문에 "#[spec :: mocks :: mock : 0x3fda2a4736c0 @name = "file "]로 전달되었습니다. 그것은 예외 출력에 더 많은주의를 기울이는 것을 가르쳐 줄 것입니다.

대신 사용해야합니다 multipart_post 인증 호출을 블록에서 스터브합니다.

it "should allow authenticated file uploads" do
    file = File.open(a_valid_file)

    multipart_post( resource(:assets), :method => "POST", 
            :params => { :file => file } ) do |controller|
        controller.stub!(:ensure_authenticated).and_return(true)
        controller.session.stub!(:user).and_return(User.first)

    )
end
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top