我正在为控制器任务(索引动作)编写一些测试,其中包含一个实例变量@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和我想要的内容?
谢谢
答案 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
实例化一个控制器,这就是为什么控制器测试具有所有存根的原因。