为搜索控制器编写Rails集成测试

时间:2015-04-24 23:14:54

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

我正在测试我的应用。我有一个功能,你可以通过名字,姓氏,城市,州等搜索注册会员...我认为集成测试比控制器测试更好,但我很难找到哪里去开始。这是我的控制器的代码:

class MsearchesController < ApplicationController

  def new
    @msearch = Msearch.new
    @first_name = User.uniq.pluck(:first_name)
    @last_name = User.uniq.pluck(:last_name)
    @state = User.uniq.pluck(:state)
    @cities = User.uniq.pluck(:city)
  end

  def create
    @msearch = Msearch.create(msearch_params)
    redirect_to @msearch
  end

  def show
    @users = User.all

    @msearch = Msearch.find(params[:id])
    @first_name = User.uniq.pluck(:first_name)
    @last_name = User.uniq.pluck(:last_name)
    @states = User.uniq.pluck(:state)
    @cities = User.uniq.pluck(:city)
  end

  def update
    @msearch = Msearch.new
  end

private 

  def msearch_params
     params.require(:msearch).permit(:first_name, :last_name, :state, :city, :agency)
  end

end

非常感谢帮助我入门的任何帮助!

1 个答案:

答案 0 :(得分:0)

我同意这在接受级别比控制器级别更好地测试,因为在控制器测试中你没有什么能够真正断言它会验证它做了它应该做的事情。 。 Controller将工作委托给业务对象和视图。您需要运用所有这些来验证它是否正确地完成了工作。由于这个原因,控制器单元测试通常是多余的。

我会使用类似下面的内容在接受级别测试此功能(假设您使用的是Capybara和FactoryGirl)。

feature "User Search", type: :feature do

  scenario "search for user by first name" do
    @frodo = create(:user, first_name: "Frodo")
    @sam = create(:user, first_name: "Sam")

    visit new_msearch_path
    fill_in "user_first_name", with: "Frodo"
    click_button "Search"

    expect(page).to have_content "Frodo"
    expect(page).to_not have_content "Sam" 
  end

  # ... similar tests to cover each field / search case ...

end

来自宝石的Msearch类?或者你自己实现了吗?如果它是您自己的类,您可能还希望在单元级别进行测试,这样您就可以在没有完整堆栈开销的情况下运行更复杂的边缘情况。