我正在为现有的应用程序添加测试。这是我的控制器:
class JobsController < ApplicationController
before_action :set_job, only: [:show, :edit, :update, :destroy]
def index
if params[:filter]
@jobs = Job.order(applied_on: :asc)
else
@jobs = Job.all
end
end
end
这是我的spec文件:
require 'rails_helper'
RSpec.describe JobsController, type: :controller do
describe "#index" do
it "should render index template" do
get(:index)
expect(response).to render_template(:index)
end
end
end
如果我注释掉整个索引操作,并运行测试它仍然通过?这是为什么?
我试过的其他场景:
注释掉路线resources :jobs
会使测试失败
我该如何解决这个问题?很明显,无论测试结果如何,测试都会通过,而且这里没有测试正确的测试。
答案 0 :(得分:2)
这是Rails&#39;魔法&#39;的一部分。约定优于配置。
如果您的路由指向控制器操作,Rails将首先尝试在控制器上找到该操作。在您的情况下,它会查找index
操作。
如果找不到,一切都不会丢失。 Rails假定您故意将其遗漏,因为它是空白的,并且渲染相应视图不需要特定的逻辑。除了这个默认假设,它将在控制器的视图目录(例如index.html.erb
)中查找匹配的模板,如果找到一个名称与控制器操作相匹配的模板,它将呈现它。 / p>
这是明智的默认值。有时控制器操作只是空方法,因为它们不会将任何实例变量分配给视图。在这些情况下,Rails使控制器方法(动作)完全可选,这意味着连接新视图的开销更少。