分配已提取到一个宝石。使用gem'rails-controller-testing'。宝石有替代品吗?

时间:2018-11-02 03:13:23

标签: ruby-on-rails rspec

我正在为控制器任务(索引动作)编写一些测试,其中包含一个实例变量@tasks和所有任务(Task.all)。

如果我遵循官方文档:

RSpec.describe TeamsController do
  describe "GET index" do
    it "assigns @teams" do
      team = Team.create
      get :index
      expect(assigns(:teams)).to eq([team])
    end

    it "renders the index template" do
      get :index
      expect(response).to render_template("index")
    end
  end
end

assigns方法已移至gem文件“ rails-controller-testing”。 我有两个问题:

1-如何实现与expect(assigns(:teams)).to eq([team])相同的功能。我想我想问的是,如何检查索引操作中是否有值为[team]的实例变量

2-如果将此方法移到了gem上,我读过Github问题,原因是:您不应该在那里进行测试,控制器应该只测试响应,Cookie等。但是我感到困惑,因为津津乐道,您可以测试实例变量。我应该在那里测试吗?如果没有,在哪里?在我的views / index_spec.rb中,测试我是否拥有所有团队?

3-替代方法:由于TeamsController是一个普通的类,我应该在spec / models / folder spec/models/tasks_controller.rb中创建一个spec并在那里测试方法index是否具有实例变量@teams和我想要的内容?

谢谢

1 个答案:

答案 0 :(得分:1)

整个想法是,与其在控制器内部进行测试并测试其内部变量,不如通过测试输出来测试控制器。

在RSpec中,您可以使用请求和功能规范来执行此操作。

# config/specs/features/teams_spec.html
RSpec.feature 'Teams' do
  scenario 'when a user views the teams' do
    Team.create(name: 'Team Rocket')
    visit '/teams'
    expect(page).to have_content 'Team Rocket'
  end
end 

# config/specs/requests/teams_spec.html
RSpec.describe 'Teams', type: :request do
  describe 'GET /teams.json' do
    it "includes the team" do
      team = Team.create(name: 'Team Rocket')
      get teams_path(format: :json) 
      expect(parsed_response.first['name']).to eq 'Team Rocket'
    end  
  end
  describe 'GET /teams' do
    it "includes the team" do
      team = Team.create(name: 'Team Rocket')
      get teams_path
      expect(page).to have_content 'Team Rocket'
    end  
  end
end

主要区别在于功能规范从用户故事pov来测试应用,而请求规范则处于较低级别。

  

1-如何达到与Expect(assigns(:teams))。to相同的效果   eq([team])。我想我在问,如何检查我是否有实例   索引操作中的变量,其值为[team]

要么使用assign gem获得旧版兼容性,要么测试渲染的输出。

  

2-如果将此方法移到了gem上,我读过Github问题,   原因是:您不应该在那里进行测试,控制器应该   只是测试响应,Cookie等。但是我很困惑,因为喜欢你   可以测试实例变量。我应该在那里测试吗?如果不,   哪里?在我的views / index_spec.rb中,测试我是否拥有所有团队?

如果说ReSpec是RSpec,那么RSpec-rails花费了一段时间才赶上Rails测试的最新水平。但同样适用。 RSpec团队的官方建议是不要使用分配,而应使用控制器规范来支持请求规范。视图规范在这里并不是真正相关的-如果您要单独测试复杂的视图,可以使用它们。

  

3-替代:由于TeamsController是普通类,我应该   在规格/模型/文件夹中创建规格   spec / models / tasks_controller.rb并测试方法索引是否具有   实例变量@teams是否包含我想要的内容?

没有。控制器不仅仅是普通的类。您不能仅使用MyController.new实例化一个控制器,这就是为什么控制器测试具有所有存根的原因。