0

我正在使用 Rails 3.2、Rspec 2 和 capybara 2。

我正在截断网页中的一串正文文本,并希望在我的功能规范中对此进行测试。

有人可以建议如何做到这一点,因为我似乎无法在我的测试中调用 truncate 因为它一直说这是一个未定义的方法,我真的不想在我的测试套件中有一长串被截断的文本;只需应用 truncate 函数就足够了。

我试过使用helper.truncate()view.truncate()但无济于事。

如果有办法生成 lorem ipsum 字符串并截断它以以某种方式进行比较,我已经在测试的其他部分使用了 Faker gem。

查看代码:

<dd><%= truncate(project.details, :length => 100) %></dd>`

测试代码

it { should have_selector('dd', @project.details) }

当我显示完整的详细信息文本时,此测试测试运行良好,但因为我决定仅在此视图中显示前 100 个字符,所以我不确定如何进行测试,而无需将详细信息设置为固定字符串和然后以某种方式检查它的截断版本。

谢谢

科尔

4

3 回答 3

1

这对我有用:)

require 'active_support/core_ext/string/filters'

it { should have_selector('dd', @project.details.truncate(100)) }
于 2013-09-30T19:29:39.933 回答
1

truncateString该类的 Rails 扩展,因此在 Ruby 或 RSpec 中不可用。可能有办法以某种方式“包含”它,但我熟悉如何做到这一点。然而,事实证明该定义是自包含的,因此您自己定义它很简单。以下是来自http://apidock.com/rails/String/truncate的源代码。它被定义为一个实例方法,所以如果你想将它与传入的字符串一起使用,你需要包含一个text参数来代替引用self,就像当前在正文的第一行中所做的那样。

# File activesupport/lib/active_support/core_ext/string/filters.rb, line 38
  def truncate(length, options = {})
    text = self.dup
    options[:omission] ||= "..."

    length_with_room_for_omission = length - options[:omission].mb_chars.length
    chars = text.mb_chars
    stop = options[:separator] ?
      (chars.rindex(options[:separator].mb_chars, length_with_room_for_omission) || length_with_room_for_omission) : length_with_room_for_omission

    (chars.length > length ? chars[0...stop] + options[:omission] : text).to_s
  end
于 2013-08-07T18:13:15.913 回答
1

最后我决定,如果在更大的屏幕上查看页面,那么更宽的列将允许显示更多的细节并减少截断文本的需要,所以我决定使用 css 修剪细节以减少使用以下内容显示在屏幕上:

.text-trim {
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
于 2013-11-18T20:33:57.920 回答