测试从控制器创建方法

问题描述:

我期待在我的控制器中测试我的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 } 

是这里有什么区别,我应如何检测呢?

而且还当我尝试和测试闪光的成功已经设置(使用早该宝石)

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. 您的测试方法,另一种是,在第一种情况下,你要测试的模式,而在第二种情况下,你要测试的控制器之间的差异。另外,验证应该在模型上进行测试;闪光消息和动作行为,在控制器内。

  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返回任何结果。

+0

谢谢您的回答,我有一个'create.js.erb'文件,该文件规定在一个div中的Flash消息..我不断收到'ActionController :: UnknownFormat:'当运行你的例子 – Richlewis

+0

好吧,现在有一些调整,改变'expect(flash.now [:success] .now).to be_present 'to'expect(flash [:success])。to be_present'并且在后续操作中添加了'format::js' – Richlewis

+0

为什么你需要'js'格式?不应该使用纯文本或html文本?它是否允许'jsonp' ajax请求? – Wikiti