一段时间水豚之后链接不隐藏

时间:2016-04-25 05:34:55

标签: ruby-on-rails ruby rspec capybara

我使用capybara来测试位于我的评论模型中的代码(5分钟是传统的):

 def editable?
    self.created_at < (Time.now - 5.minute)
 end

链接视图:

- unless comment.editable?
  = link_to 'Edit', edit_category_theme_comment_path(@category, @theme, comment)

所以5分钟后链接到编辑必须从页面隐藏(但我们需要刷新页面)。以下是RSpec中用于创建注释和测试链接隐藏功能的代码:

 def create_comment(options={})
   options[:content] ||= 'I am a comment'

   visit category_theme_path(category, theme)
   within '.comment-form' do
     fill_in 'Content', with: options[:content]
     click_button 'Submit'
   end
 end

 context 'Comment has content' do
   before(:each) { create_comment }

   it 'hides the edit symbol due 5 minutes after comment was created' do
     using_wait_time 400 do
       visit category_theme_path(category, theme)
       save_and_open_page
       expect(page).to have_no_css('.comment-edit')
     end
   end

 end

但我得到了:Failure/Error: expect(page).to have_no_css('.comment-edit')expected #has_no_css?(".comment-edit") to return true, got false

我也尝试使用page.reload!expect(page).to have_no_css('.comment-edit', wait: 400)和其他相关工作人员,但水豚不想等待。也许我会将using_wait_time用于错误的地方,如果那样 - 我该如何测试呢?

enter image description here

2 个答案:

答案 0 :(得分:1)

Work with seed data that is 5 minutes old and visit that page. Like this you do not need to wait five minutes.

Also your code

- unless comment.editable?
  = link_to 'Edit', edit_category_theme_comment_path(@category, @theme, comment)

should probably read

- if comment.editable?
  = link_to 'Edit', edit_category_theme_comment_path(@category, @theme, comment)

答案 1 :(得分:1)

您的测试方法存在许多问题。你的尝试失败的原因是因为using_wait_time只是设定了Capybaras匹配器等待他们的期望变为真的时间量,它实际上并没有让程序等待。因此,expect(page).to have_no_css('.comment-edit')将等待您的using_wait_time指定的时间,每50毫秒左右重新检查一次内容,但它永远不会重新加载页面,并且在加载页面之前不会等待。对于您的工作方法,您需要在访问页面之前睡觉

it 'hides the edit symbol due 5 minutes after comment was created' do
  sleep 5.minutes      
  visit category_theme_path(category, theme)
  save_and_open_page
  expect(page).to have_no_css('.comment-edit')
end
然而,这是一个糟糕的主意,因为你的测试会变得非常缓慢。

而不是那种方法,你可能已经产生了你的测试评论&#34; old&#34; (正如pascal betz建议的那样),使用类似FactoryGirl的东西并指定超过5分钟前​​的created_at。

FactoryGirl.create(:comment, created_at: 5.minutes.ago)

或者如果您想继续通过界面创建评论,那么请添加Timecop gem之类的内容,您可以

 Timecop.travel(5.minutes.from_now) do
   visit category_theme_path(category, theme)
   save_and_open_page
   expect(page).to have_no_css('.comment-edit')
 end

在访问页面之前将时钟向前移动5分钟,然后在块完成后将其重置为正常。

此外,您的editable?方法正在以错误的方向进行比较,应该是

def editable?
  self.created_at > (Time.now - 5.minute)
end

那么视图应该是

- if comment.editable?
  = link_to 'Edit', edit_category_theme_comment_path(@category, @theme, comment)