用merb测试经过身份验证的文件上传

时间:2009-08-07 04:58:54

标签: file-upload rspec mocking merb

过去几天,这让我很生气。我有一个操作,允许经过身份验证的用户将资产上传到网站。我知道控制器操作是正确的,因为我可以手动运行该过程但是我想使用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)没有为任何模拟对象通过请求设置。

问题是:我是否采用正确的方式来测试文件上传,如果不是,那是另一种方式?

1 个答案:

答案 0 :(得分: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