2016-06-11 108 views
0

我期待在我的控制器中測試我的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
  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