这是一些已经快把我逼疯了,在过去的几天。我有一个动作,它允许通过验证的用户资源上传到该网站。我知道控制器操作是正确的,因为我可以通过过程手动运行但是我想用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)没有被置位为任何模拟对象通过请求使它。

现在的问题是:我要对测试文件上传正确的方式,如果没有什么法子

有帮助吗?

解决方案

我是做错了。通过使用request有人呼吁所有PARAMATERS to_s,所以我的模仿对象是为“#[规格::嘲笑::模拟:0x3fda2a4736c0 @name = \”文件\“]”被传递。这将教我更注重的异常输出。

相反,我应该使用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