首先我要说的是,我是一个在这里编写测试的新人,只使用 Rails 几个星期。 为我的手机验证编写 rspec 测试。首先是一些代码:
User.stub(:create).and_return(@user)
@user.stub(:send_sms).with('foo').and_return('bar')
sign_in @user
visit home_path
click_link 'Telephone verification'
现在这是我的用户中的方法,我想 stub 并返回任意值,而不实际进入真正的方法:
def send_sms
TWILIO_CLIENT.account.sms.messages.create(
:from => TWILIO_SMS_NUMBER,
:to => phone,
:body => "Verification code is: #{sms_code}"
)
end
我在这里做的事情正确吗?我什至不确定,我读了很多关于这个主题的东西,仍然很困惑。
由于我没有为测试环境初始化 TWILIO_CLIENT,所以当我 save_and_open_page 时,我收到此错误:
uninitialized constant User::TWILIO_CLIENT
所以我想 stub send_sms 方法,这是正确的做法吗?
请您参考如下方法:
I don't have TWILIO_CLIENT initialized for test environment
您需要在某处定义这些常量。它应该很简单:
TWILIO_CLIENT = double('twilio_client')
TWILIO_SMS_NUMBER = double('twilio_sms_number')
现在您可以在测试替身上 stub 方法。
要对调用本身进行 stub ,您可以使用 stub_chain
:
TWILIO_CLIENT.stub_chain(:account, :sms, :messages, :create)
虽然这应该可行,但每当您看到 stub_chain
时,它都表明您可能需要重构。在这种情况下,您可能不应该接触 TWILIO_CLIENT 并扰乱其内部结构。