2009-08-07 9 views
0

これは過去数日間私を怒らせてしまったものです。私は、認証されたユーザーが資産をサイトにアップロードできるようにするアクションを持っています。手動でプロセスを実行することができますが、rspecを使用してテストする必要があるため、コントローラのアクションが正しいことがわかります。Merbで認証されたファイルのアップロードをテストする

requestヘルパーを使用する必要があるため、この一連のテストでは:givenという認証セッションを再利用できます。

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

私の推測:

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 

は、私はスペックを実行すると、デバッガを介してコントローラのアクションでパスにアクセスしようとすると、しかし、私はこれを取得、それはすべてがうまく動作スペックの内側にブレークポイントを設定した場合stub!(:path)が、リクエストを通じてモックオブジェクトが作成しているものに設定されていないことです。

質問は次のとおりです。ファイルアップロードをテストするための適切な方法はありますか?それ以外の方法はありますか?

答えて

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 
関連する問題