1

如何在测试中使用gets方法?

我想编写一个交互式规范,在我的规范中我登录到一个网站,该网站要求确认短信。在运行规范之前我不知道短信代码,这就是我在测试运行期间输入短信代码的原因。

当我尝试执行类似sms = gets.chomp 的操作时,出现以下错误:

Errno::ENOENT:
       No such file or directory - spec/login/login_spec.rb
4

2 回答 2

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
于 2013-11-15T18:21:13.070 回答
0

原则上rspec, 和单元测试通常不应该是交互式的。通过在测试中实际发送短信,您需要:

  • 手头有相关电话
  • 等待 SMS 到达(在您决定它失败之前多长时间?)
  • 阅读 SMS 并将其(正确!)填回您的运行测试中。

这意味着你的规范不是自动化的,而不是每天运行几十次(因为单元测试本来是要运行的),你将每周运行一次,如果有的话,因为它会是这样一个痛苦地跑。

将实时 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
于 2014-03-24T07:35:12.173 回答