测试从控制器创建方法

时间:2016-06-11 17:10:17

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

我希望在我的控制器中测试我的create方法,检查我的验证和flash消息是否设置正确。到目前为止我所拥有的是

it 'is invalid with invalid formatted email' do
  @message = Message.new(FactoryGirl.attributes_for(:message_invalid_email))
  @message.valid?
  expect(@message.errors[:email].first).to eq("Don't forget to add your email address")
end

但我看到其他人设置了他们的测试,如

@message = post :create, message: { params1: value1 }

这里有什么不同,我应该如何测试呢?

当我尝试测试已经设置了闪光成功时(使用shoulda gem)

it 'is valid with correct parameters' do
  @message = Message.new(FactoryGirl.attributes_for(:valid_message))
  expect(@message).to be_valid
  expect(controller).to set_flash[:success]
end

我收到此错误

Expected the flash[:success] to be set, but no flash was set

这是我的控制器

def create
  @message = Message.new(message_params)
  respond_to do |format|
    if @message.valid?
      format.js { flash.now[:success] = "Thanks for your message, I'll be in touch soon" }
    else
      format.js { flash.now[:alert] }
    end
  end
end

1 个答案:

答案 0 :(得分:1)

  1. 您的测试方法与另一种测试方法之间的区别在于,在第一种情况下,您正在测试模型,在第二种情况下,您正在测试控制器即可。此外,应在模型上测试验证;控制器内的闪存消息和操作行为。

  2. 我认为您没有使用create致电expect(controller).to set_flash[:success]行动。也许你应该尝试类似下面的块:

    it 'is valid with correct parameters' do
      post :create, message: { params1: value1 } # Whatever POST action
      expect(flash.now[:success].now).to be_present
    end
    
  3. 您的控制器是否按预期工作? format.js正在返回一个字符串(flash.now[:success]flash.now[:alert]而不是javascript代码。也许您应该使用format.text,或者不使用render status: :created, nothing: true返回任何内容。