【发布时间】:2019-07-15 03:12:49
【问题描述】:
我有我正在尝试测试的控制器。
class ShortLinksController < ApplicationController
after_action :increment_view_count, only: :redirect_to_original_url
def redirect_to_original_url
link = ShortLink.find(params[:short_url])
redirect_to "http://#{link.original_url}"
end
private
def increment_view_count
ShortLink.increment_counter(:view_count, params[:short_url])
end
end
这是redirect_to_original_url的路由:
get 's/:short_url', to: 'short_links#redirect_to_original_url', as: 'redirect_to_original_url'
还有我的 Rspec 测试:
describe "#redirect_to_original_url" do
let(:short_link) {ShortLink.create(original_url: 'www.google.com')}
subject {get :redirect_to_original_url, params: {short_url: short_link.id}}
it 'should increment the count by 1 original url is visited' do
expect {subject}.to change{ short_link.view_count }.by(1)
end
end
由于某种原因,我在运行测试时收到以下错误:
expected `short_link.view_count` to have changed by 1, but was changed by 0
我的逻辑有效,因为我可以看到它将单个链接 view_count 增加 1,但不是我的测试。
【问题讨论】:
-
您的测试中是否调用了
increment_view_count的after_action?您可以通过在该函数中放置一个调试器或puts来了解这一点。 -
@JakeWorth 是的,它正在被调用
-
不错!在测试中调用主题之前和之后的计数是多少?您可以通过将“期望”替换为仅打印计数、调用操作,然后再次打印计数来解决此问题。
-
它仍然是 0。这就是为什么它很奇怪。我想也许我需要重新加载,但这没有用。
-
试试
change{ short_link.reload.view_count }
标签: ruby-on-rails rspec rspec-rails