【问题标题】:RSpec/Rails template rendering matching incorrectly? ("_x" matches "_xy"?)RSpec/Rails 模板渲染匹配不正确? (“_x”匹配“_xy”?)
【发布时间】:2011-12-11 23:49:17
【问题描述】:

还是我误会了什么?

部分居住在:

app/views/admin/command_templates/_fillerup.html.erb

此规范通过(视图目录中没有“fill”或“_fill”):

describe "GET fillerup" do
  it "assigns some stuff and renders a partial" do
    should render_template "admin/command_templates/_fill"     # I expected failure
    should render_template "admin/command_templates/_fillerup" # "Correct" test
  end
end

这失败了(正如我所料):

describe "GET fillerup" do
  it "assigns some stuff and renders a partial" do
    should render_template "admin/command_templates/_fillerupp" # extra "p"
  end
end

表现就像它在路径上做一个start_with?,也许是为了忽略扩展,或者......?

rspec-rails 2.7.0,rails 3.1.2;可根据要求提供其他信息。

验证行为是否存在(或不存在)将有助于进行健全性检查。

【问题讨论】:

  • 这与您的问题有些正交,但请注意,这些测试完全没有用。您通常不应该关心正在渲染什么部分,或者分配了什么;一旦到达控制器级别,您唯一应该测试的是用户看到的内容——所以只需测试呈现的 HTML(最好使用 Cucumber,而不是控制器规范)。
  • @MarnenLaibow-Koser 显示的 sn-ps 不代表实际测试;他们是SSCCEs 来解释我看到的行为。反正这部分已经不在测试中了。

标签: ruby-on-rails rspec ruby-on-rails-3.1 rspec-rails


【解决方案1】:

查看render_template 的代码 - 其中许多方法通过正则表达式进行模式匹配,这将与starts_with? 类似地匹配,至少与模式“Joe”将匹配的意义相同字符串“Joe Smith”和“Joe Blank”。我不是在这里做模式匹配正义,但这只是一个例子。

按照我的理解,这种模式匹配主要是为了方便,因此您不必在测试中过于具体,这会使您的测试框架不那么脆弱。您通常可以不用担心,因为模板通常没有如此相似的名称。

如果您只需要匹配特定模板(而不是其他模板),您可以添加额外的条件测试,例如:

should render_template('x')
should_not render_template('xy')

...或类似的东西,它应该有效地过滤掉以相似名称开头但不是您感兴趣的模板的模板。

【讨论】:

  • 同意,这是一个(某种)边缘情况。也使测试毫无用处,因为一个错字可能完全被忽视:/感谢您查看它——我希望另一组眼睛关注 RSpec 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-21
  • 2021-05-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多