如何在测试中使用gets方法?
我想编写一个交互式规范,在我的规范中我登录到一个网站,该网站要求确认短信。在运行规范之前我不知道短信代码,这就是我在测试运行期间输入短信代码的原因。
当我尝试执行类似sms = gets.chomp
的操作时,出现以下错误:
Errno::ENOENT:
No such file or directory - spec/login/login_spec.rb
如何在测试中使用gets方法?
我想编写一个交互式规范,在我的规范中我登录到一个网站,该网站要求确认短信。在运行规范之前我不知道短信代码,这就是我在测试运行期间输入短信代码的原因。
当我尝试执行类似sms = gets.chomp
的操作时,出现以下错误:
Errno::ENOENT:
No such file or directory - spec/login/login_spec.rb
在您想要使用的规范中$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
原则上rspec
, 和单元测试通常不应该是交互式的。通过在测试中实际发送短信,您需要:
这意味着你的规范不是自动化的,而不是每天运行几十次(因为单元测试本来是要运行的),你将每周运行一次,如果有的话,因为它会是这样一个痛苦地跑。
将实时 SMS 测试留给系统测试,并通过存根实际发送行为来对该功能进行单元测试,并检查接收到的参数:
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