【问题标题】:Rspec controller test failing with Apostrophe Character?Rspec 控制器测试因撇号字符而失败?
【发布时间】:2017-06-08 10:54:46
【问题描述】:

现在我的单元测试使用“Faker”公司名称失败。

似乎expect(response.body).to match(@thing.name) 搞砸了。

查看错误时,Faker 公司名称有时会包含“O'Brian Company”或“O'Hare Company”或类似名称。

faker 是编码字符串吗?因为我知道匹配编码字符串不是一个好主意,而且我真的不想只在使用的 Factory 中指定特定的公司名称。

谢谢

【问题讨论】:

  • 我很好奇为什么你觉得我的回答不够。有什么我可以澄清的吗?
  • include 的问题在于,如果它“包含”它,我希望它完全匹配它,而不仅仅是名称中的“存在”这个词。尽管我可以将其用作后备,但在其中将您的答案标记为正确:)。我真的只是想寻找其他的可能性。

标签: ruby-on-rails rspec factory faker


【解决方案1】:

Faker 不会为您进行任何编码。它只会给你一个像O'Malley 这样的字符串。但是响应应该有 HTML 转义(或其他类型,取决于格式),如 O'Malley。您可以随时puts response.body 确定。

RSpec matches 匹配器确实设计为for either expected or actual to be a regular expression,但在您的情况下,两者都是字符串。因为代码has an optimization calling values_match? 哪个does a simple comparison,你实际上是在说expect(response.body).to eq(@thing.name)

如果您确实需要正则表达式,那么您应该小心使用不受控制的值来创建它,这是正确的。幸运的是,Ruby 有Regexp.escape,所以你可以说Regexp.new("foo" + Regexp.escape(@thing.name) + "bar")。但是从您对include 的反对来看,听起来您实际上希望响应中只包含名称,对吧?在这种情况下,您根本不需要正则表达式。

无论如何,问题不在于名称​​周围是什么,而在于名称是如何转义的。因此,在比较之前,您应该 (1) 解码响应或 (2) 编码伪造字符串。哪个并不重要。两者都很简单:

expect(CGI.unescapeHTML(response.body)).to eq @thing.name

expect(response.body).to eq CGI.escapeHTML(@thing.name)

当然,如果你的响应是 JSON,你应该用 JSON 等替换所有这些 HTML 转义的东西。

【讨论】:

【解决方案2】:

您可以尝试使用#include 而不是#match。

expect(response.body).to include(@thing.name)

【讨论】:

    【解决方案3】:

    假设您指的是Faker gem 中的Faker::Company

    使您的示例期望通过的正确方法是使用Regexp,如@rafael-costa 示例中所示。这样做可以避开撇号之类的内容。

    使用 Faker 的问题在于您的测试不是确定性的。最佳实践是为您的测试提供静态、已知的输入,并期望输出通过基于这些输入的某些预期。如果没有更多信息,很难提供相关示例,但可能是这样的:

    company = Company.new(name: 'Acme Anvils')
    get :show, params: {id: company.to_param}, session: {}
    expect(response.body).to match(Regexp.new('Acme Anvils', Regexp::MULTILINE))
    

    此外,您通常不应该在控制器规格中测试特定的主体输出。这样做就是跨目的进行测试。你通常会为此write a view test

    【讨论】:

      【解决方案4】:

      您可以尝试传递正则表达式而不是字符串:

      expect(response.body).to match(Regexp.new(@thing.name))
      

      另外,如果问题只是当你从faker那里得到这种类型的名字时,那么你应该看看这个QA,它提供了一些很好的见解。

      【讨论】:

      • 我猜不使用它的问题是我需要定义很多样本测试数据。但在某种程度上它很好,因为它确实显示了奇数值的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多