我使用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
用于错误的地方,如果那样 - 我该如何测试呢?
答案 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)