如何在测试中使用gets方法?
我想写一个交互式规范,在我的规范中我登录到一个网站,它要求确认短信。我在运行规范之前不知道短信代码,这就是我在测试运行期间输入短信代码的原因。
当我尝试做sms = gets.chomp
之类的事情时
我收到以下错误:
Errno::ENOENT:
No such file or directory - spec/login/login_spec.rb
答案 0 :(得分:2)
在您的规范中,您要使用$stdin
。您的代码应如下所示:
it "sends an SMS and verifies it" do
SMSVerifier.send_verification_code(test_phone_number)
print "Enter the sms code you received: "
code = $stdin.gets.chomp
SMSVerifier.check_verification_code(test_phone_number, code).should == true
end
答案 1 :(得分:0)
原则上,rspec
和一般 的单元测试不应该 是互动的。通过在测试中实际发送短信,您需要:
这意味着您的规范不是自动化的,而不是每天运行数十次(因为单元测试意味着运行),您将每周运行一次,如果有的话,因为它会跑得这么痛苦。
将实时SMS测试留给系统测试,并通过 stubbing 实际发送行为对此功能进行单元测试,并检查收到的参数:
it "sends an SMS and verifies it" do
sent_text = nil
expect(SMSSender).to receive(:send).with(test_phone_number, an_instance_of(String)) do |num, text|
sent_text = text
end
SMSVerifier.send_verification_code(test_phone_number)
SMSVerifier.check_verification_code(test_phone_number, sent_text).should be_true
end