Rspec STDIN获得

时间:2013-08-20 15:59:13

标签: ruby rspec io user-input specifications

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

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

当我尝试做sms = gets.chomp之类的事情时 我收到以下错误:

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

2 个答案:

答案 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