mocha 是否在存根(Rails)中运行代码?
我对 tdd 和存根很陌生。当我存根一个方法时,我假设该方法中的任何代码都不会被执行?我试图伪造引发异常的方法,但我的测试结果表明该方法中的代码正在执行而不是被绕过。
谁能帮忙解释一下为什么?
我的存根是
@logged_in_user.subscription.stubs(:stop_auto_renew).raises(:RuntimeError)
,在上下文中,
test "canceling subscription should handle exception raised by spreedly" do
login_larry_active
@logged_in_user.subscription.stubs(:stop_auto_renew).raises(:RuntimeError)
delete :destroy, {:user_id => @logged_in_user.id}
assert flash[:notice]
assert_redirected_to :controller => :dashboard, :action => :welcome
end
这是我的模型中试图存根的方法。 Spreedly::订阅者通常从网络上获取内容。
class Subscription < ActiveRecord::Base
protected
def stop_auto_renew
Spreedly::Subscriber.find(self.user.id).stop_auto_renew()
end
end
-
class SubscriptionsController < ApplicationController
def destroy
user = User.find(params[:user_id])
if user
begin
user.subscription.stop_auto_renew
rescue RuntimeError
#log something and email admin
ldb("Spreedly cant process stop_auto_renew for user id: #{user.id}")
#email admin
end
flash[:notice] = "You have successfully cancelled your subscription and will take effect at the end of your current billing month"
end
redirect_to :controller => :dashboard, :action => :welcome
end
end
测试误差为
4) Error:
test_canceling_subscription_should_handle_exception_raised_by_spreedly(SubscriptionsControllerTest):
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.stop_auto_renew
app/models/subscription.rb:18:in `stop_auto_renew'
app/controllers/subscriptions_controller.rb:31:in `destroy'
/test/functional/subscriptions_controller_test.rb:42:in `test_canceling_subscription_should_handle_exception_raised_by_spreedly'
Im new to tdd and stubbing. When I stub a method im assumng that any code within that method does not get executed? Im trying to fake the method raising an exception but the results of my test indicate that the code in that method is being executed rather than bypassed.
can anyone help explain why?
My stubbing is
@logged_in_user.subscription.stubs(:stop_auto_renew).raises(:RuntimeError)
and in context
test "canceling subscription should handle exception raised by spreedly" do
login_larry_active
@logged_in_user.subscription.stubs(:stop_auto_renew).raises(:RuntimeError)
delete :destroy, {:user_id => @logged_in_user.id}
assert flash[:notice]
assert_redirected_to :controller => :dashboard, :action => :welcome
end
this is the method in my model im trying to stub. Spreedly::Subscriber normally fetches stuff from over the web.
class Subscription < ActiveRecord::Base
protected
def stop_auto_renew
Spreedly::Subscriber.find(self.user.id).stop_auto_renew()
end
end
-
class SubscriptionsController < ApplicationController
def destroy
user = User.find(params[:user_id])
if user
begin
user.subscription.stop_auto_renew
rescue RuntimeError
#log something and email admin
ldb("Spreedly cant process stop_auto_renew for user id: #{user.id}")
#email admin
end
flash[:notice] = "You have successfully cancelled your subscription and will take effect at the end of your current billing month"
end
redirect_to :controller => :dashboard, :action => :welcome
end
end
and the test error is
4) Error:
test_canceling_subscription_should_handle_exception_raised_by_spreedly(SubscriptionsControllerTest):
NoMethodError: You have a nil object when you didn't expect it!
The error occurred while evaluating nil.stop_auto_renew
app/models/subscription.rb:18:in `stop_auto_renew'
app/controllers/subscriptions_controller.rb:31:in `destroy'
/test/functional/subscriptions_controller_test.rb:42:in `test_canceling_subscription_should_handle_exception_raised_by_spreedly'
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我可能是错的,但我的猜测是您已经在对象
@logged_in_user.subscription
上存根了方法:stop_auto_renew
(我假设用户有订阅?),但随后调用实际上是在控制器中的User.find(params[:user_id])
创建的不同实例上进行的。也许尝试
Subscription.any_instance.stubs(:stop_auto_renew)...
它应该存根订阅的所有实例。I could be wrong but my guess is that you have stubbed the method
:stop_auto_renew
on the object@logged_in_user.subscription
(I assume that user has a subscription?) but then the call is actually made on a different instance created from theUser.find(params[:user_id])
in your controller.Perhaps try
Subscription.any_instance.stubs(:stop_auto_renew)...
which should stub all the instances of a Subscription.