【问题标题】:Rspec manipulate upload size validator within a testRspec 在测试中操纵上传大小验证器
【发布时间】:2019-06-12 09:05:29
【问题描述】:

在我的 attachment 模型上,我得到了这个验证:

validates_attachment_size :data, less_than: 8.megabyte, message: :data_file_size_error

它正在做我需要的一切,但为了测试它,现在我实际上必须在我的磁盘空间上存储一个 9 MB 的文件。由于我的应用程序相当庞大,我想避免这样做。

所以我的想法是 - 我可以操纵验证方法本身,但只是为了测试。比方说,将context块大小内的验证设置为5 KB,尝试上传一个6 KB的文件,然后将其恢复正常?

(为了记录:这个过程相当麻烦 - 我正在创建一封传入的电子邮件,然后向其中添加一个文件,然后尝试导入这个文件。这就是为什么我想保持文件相当小的原因。另一个我尝试的选项是stub 文件大小,但在集成测试中,Rspec 仍会访问实际大小,因此导致测试失败)

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-4 rspec rspec-rails


    【解决方案1】:

    我认为你不能轻易地存根文件大小,因为它只检查一次,在类加载期间。不过,有很多方法可以解决这个问题:

    1. 您可以在添加到 .gitignore 的某个目录中保留一个 9MB 的文件,例如tmp/testfiles 并且在运行规范时,如果该文件不存在,您可以生成该文件。这样您只会生成一次,因此未来的测试会更快(无需每次都生成)并且您不会将其保存在存储库中

    2. 您可以使less_than 选项动态化,即执行less_than: -> { maximum_file_size } 之类的操作,然后定义方法def self.maximum_file_size; 8.megabyte; end。然后您应该能够轻松地存根,因为最大大小是在每次上传时确定的。缺点是您添加动态选项只是为了测试目的,但它会影响您的生产代码。

    3. 您可以只编写一个单元测试来验证是否调用了正确的大小。 it { should validate_attachment_size(:image).less_than(5.megabytes) }。然后你不执行实际的文件上传,但只要你信任你的库,这个测试就足够了。 (代码假定您使用的是 Paperclip,它可能与其他库看起来不同)。

    【讨论】:

      【解决方案2】:

      实际上我认为这个解决方案非常优雅,我最终使用了它:

      validator = Profile::Attachment._validators[:data].find{|validator| validator.options[:less_than]}
      validator.stubs(:options).returns({less_than: 2500, message: :data_file_size_error}) # 2500 Bytes are ~ 2,44 KB
      

      使用此代码,我可以上传一个 3KB 的文件,这将导致验证失败。

      【讨论】:

        猜你喜欢
        • 2013-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-23
        • 1970-01-01
        • 2011-06-24
        • 1970-01-01
        相关资源
        最近更新 更多