質問

これは、過去数日間、私は怒っ駆動されたものです。私は、認証済みユーザーがサイトにアセットをアップロードすることを可能にする作用を有します。私は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)が要求を通してそれを作っているモックどんなオブジェクトに設定されていないということです。

質問です:私は、テストファイルアップロードのための、別の方法は何かないかの正しい方法についてはあるだろう。

役に立ちましたか?

解決

私はそれが間違ってやっていました。 「[:0x3fda2a4736c0 @name = \スペック::モック::モック#」ファイル\「]」私のモックオブジェクトとして渡されたのでrequestを使用することにより、すべてのパラメータによってはto_sを呼んでいました。これは、例外出力にもっと注意を払うように私に教えてくれます。

その代わり、私は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