Rspec&回形针:用attr_accessible打破?

时间:2011-08-25 03:37:09

标签: ruby-on-rails ruby-on-rails-3 rspec paperclip

我在让我的rspec控制器测试在Rspec中传递attr_accessible时遇到问题...但不是从控制台传递。

post :create, :banner => valid_attributes

失败了,但是

Banner.create!(valid_attributes) is accepted.

如果我从横幅模型中取出attr_accessible,或者我取出validates_attachment_presence:bannerimage,它就可以了。尝试将bannerimage_attributes和四个paperclip生成的:bannerimage列添加到我的attr_accessible-没有快乐。尝试取出其他回形针验证器(内容类型,大小) - 仍然没有乐趣。任何建议都非常感激 - 我完全不知所措。

相关代码在这里:

RSPEC测试的相关位:

def valid_attributes
  demo_image = File.open(File.join(Rails.root, "spec", "samples", "laptop1.jpg"))
  {
    :name => 'Test Spec Banner',
    :bannerimage => demo_image
  }
end


describe "POST create" do
  describe "with valid params" do
    it "creates a new Banner" do
      expect {
        post :create, :banner => valid_attributes
      }.to change(Banner, :count).by(1)
  end
end

型号:

class Banner < ActiveRecord::Base
  attr_accessible :name, :url, :bannerimage

  has_attached_file :bannerimage, :styles => { :full => "960x", :thumb => "100x" }

  validates_attachment_content_type :bannerimage, :content_type => [ 'image/jpg', 'image/jpeg', 'image/gif', 'image/png'], :message => 'file must be a gif, jpeg or png image'

  validates_attachment_size :bannerimage, :less_than => 3.megabytes

  validates_presence_of :name
  validates_attachment_presence :bannerimage
  validates_uniqueness_of :name

  has_many :pages, :dependent => :nullify

  def to_s
    name
  end
end

编辑: 横幅可以通过网站创建。

下面的相关控制器代码。没有呼叫之前/之后,只是一个标准的宁静创造。

  def create
    @banner = Banner.new(params[:banner])

    if @banner.save
      redirect_to admin_banner_url(@banner), notice: 'Banner was successfully created.'
    else
      render action: "new"
    end
  end

1 个答案:

答案 0 :(得分:1)

您的代码似乎没有任何明显的问题可能导致此问题。您应注意的一件事是name上有唯一性约束,但valid_attributes始终返回相同的名称。这不是你的问题所在,我只是提到要记住这一点。

我只能为您提供有关如何自行尝试和调试的建议。您可以在规范assigns(:banner)中访问新创建的横幅广告。所以,你可以这样做:

describe "POST create" do
  describe "with valid params" do
    it "creates a new Banner" do
      expect {
        post :create, :banner => valid_attributes
        pp assigns(:banner).errors
      }.to change(Banner, :count).by(1)
  end
end

这会将横幅的错误转储到运行测试的控制台。如果没有保存横幅,这应该意味着它无效,因此首先要检查生成的错误。您还可以使用pp assigns(:banner)转储整个横幅以查看其所有属性。

抱歉没有更多帮助。我会在评论中写这个,但我需要很好的格式化。