有没有一种方法可以在RSpec控制器测试中测试模板是否具有属性



所以我正在进行我的第一个Rails项目,并正在进行一些自动化测试。现在,我有一个表单的模板,它有一个select标记,它根据模拟的API响应动态地获取信息。到目前为止,我的模板已成功渲染,但我希望能够访问select标记,并查看其子options是否和我的模拟API响应匹配。我还没能在文档中找到关于这个特定用例的很多信息,希望这里的人能给我指明正确的方向。到目前为止,我基本上拥有以下内容:

RSpec.describe MyController, type: :controller, do
describe "GET my_thing/index" do
it "renders the index template" do
stub_request(:get, "https://outsideapi.net/endpoint").
to_return(status: 200,
body: {
"values" => [
{ "name": "foo", "id": "10000" },
{ "name": "bar", "id": "10001" },
{ "name": "baz", "id": "10002" },
],
}.to_json,
headers: {})
get :index, params: { request_identifier: generate_request_identifier() }
expect(response).to have_http_status(:success)
expect(response).to render_template(:index)
# Some code that will hopefully get elements off the template
end
end

根据控制器测试的Rspec文档:

默认情况下,不会渲染视图。有关详细信息,请参见默认情况下会存根视图和render_views。

因此,首先,您需要通过在测试套件中添加render_views指令来指示Rspec呈现控制器视图,如下所述:

require "rails_helper"
RSpec.describe WidgetsController, :type => :controller do
render_views # <-- This
describe "GET index" do
it "has a widgets related heading" do
get :index
expect(response.body).to match /<h1>.*widgets/im
end
end
end

最后,您将能够使用以下方法将JSON数组与呈现的HTML进行匹配(代码未经测试,但它有望推动这一点(:


RSpec.describe MyController, type: :controller, do
describe "GET my_thing/index" do
it "renders the index template" do
# Can also be added below the `describe` call if view rendering is needed elsewhere.
render_views
select_values = [
{ "name": "foo", "id": "10000" },
{ "name": "bar", "id": "10001" },
{ "name": "baz", "id": "10002" },
]
stub_request(:get, "https://outsideapi.net/endpoint").
to_return(status: 200,
body: {
"values" => select_values,
}.to_json,
headers: {})
get :index, params: { request_identifier: generate_request_identifier() }
expect(response).to have_http_status(:success)
expect(response).to render_template(:index)
# Extract the select value names as an array of strings.
select_value_names = select_values.map {|v| v['name']}
expect(response.body).to include(select_value_names)
end
end

与此相关的是,如果您正在针对页面内容运行测试,您可能需要考虑使用接受测试框架,如Capybara,它与Rspec集成良好。

相关内容

  • 没有找到相关文章

最新更新