0

これは、過去数日間私を怒らせてきたものです。認証されたユーザーがアセットをサイトにアップロードできるようにするアクションがあります。プロセスを手動で実行できるため、コントローラーのアクションが正しいことはわかっていますが、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)、リクエストを介して作成しているモックオブジェクトに対しては設定されていません。

問題は、ファイルのアップロードをテストするための正しい方法を検討しているのか、そうでない場合は別の方法を検討しているのかということです。

4

1 に答える 1

0

私はそれを間違っていました。これを使用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
于 2009-08-13T07:44:36.613 に答える