这是我的控制者:
class PlansController
def use_new_card
@user = User.find_by_id(new_card_params[:user_id])
if new_stripe_card
...
end
private
def new_card_params
params.permit(:user_id, :stripeToken)
end
def new_stripe_card
StripeService.new({user_id: @user.id, customer_id: @user.stripe_customer_id, source: new_card_params[:stripeToken]}).new_card
end
end
我试图编写一个控制器规范来测试当POST
方法的use_new_card
正确参数时{}} new_stripe_card
{{1}适当地获取这些参数。
到目前为止,我的规范看起来像这样:
StripeService.new
但随着我的到来
describe "when proper params are passed" do
before do
@user = User.create(...)
end
it "should allow StripeService.new to receive proper parameters" do
StripeService.should_receive(:new).with({user_id: @user.id, customer_id: @user.stripe_customer_id, source: "test"})
post :use_new_card, user_id: @user.id, stripeToken: "test"
end
end
完全公平,但我不确定如何解决这个问题...我不能只是存根Failure/Error: post :use_new_card, user_id: @user.id, stripeToken: "test"
NoMethodError:
undefined method `new_card' for nil:NilClass
,因为new_card
对象上的存根方法仍会抛出这个错误(我尝试将nil
添加到StripeService.any_instance.stub(:new_card).and_return(true)
块中)
答案 0 :(得分:1)
默认情况下,存根方法返回nil
。使用and_return
指定stub ::
StripeService.should_receive(:new).and_return(whatever)
或使用较新的语法
expect(StripeService).to receive(:new).and_return(whatever)
修改强>
请原谅我挥手。您的存根必须返回一个对象,该对象将作为StripeService
的实例,以达到测试目的所需的范围。例如:
let(:new_card) { double }
let(:new_stripe_service) { double(new_card: new_card) }
...
expect(StripeService).to receive(:new).and_return(new_stripe_service)
现在,当测试引用new_stripe_service
时,RSpec将返回一个测试双精度,其中有一个名为#new_card
的方法存根,它本身就是一个双精度数。您可以添加进行测试通过所需的任何其他存根。或者,您可以为StripeService
返回new_stripe_service
的实际实例。