使用RSpec模拟多次gets用户输入 解决Ruby TDD测试阻塞问题
问题原因
你的测试代码逻辑顺序错误,所有模拟输入的代码都放在了调用input_origin_addresses_manually?("y")之后,方法执行时mock规则还没生效,就会触发真实的终端输入等待。
修正后的测试代码
it 'If user wants to add their own addresses, check that they add more than 1 address' do # 先设置输出、输入的模拟规则 expect(subject).to receive(:puts).with("Add at least 2 Addresses, hit enter after each address, type 'quit' when done") # 模拟用户依次输入两个有效地址、quit,gets默认返回的字符串带换行符,和真实输入场景保持一致 allow($stdin).to receive(:gets).and_return( "0xa95aea385130718be87b380b419eeac8da40de55\n", "0xa95aea385130718be87b380b419eeac8da40de55\n", "quit\n" ) # 所有mock规则设置完成后,再调用要测试的方法 subject.input_origin_addresses_manually?("y") # 最后执行断言 expect(subject.origin_addresses.length).to be > 1 end
额外注意事项
如果测试还是失败,请先确认你模拟的两个以太坊地址能通过check_ethereum_address_validity方法的校验,只有校验通过的地址才会被存入@origin_addresses数组。
内容的提问来源于stack exchange,提问作者sudo install
相关产品推荐
相关产品推荐

