/ / रूबी के साथ उपयोगकर्ता इनपुट का परीक्षण करने के लिए RSpec का उपयोग करना - रूबी, यूनिट-परीक्षण, rspec

हो जाता है-रूबी, यूनिट-परीक्षण, RSpec के साथ उपयोगकर्ता इनपुट परीक्षण करने के लिए RSpec का उपयोग

मैं RSpec और रूबी का उपयोग करके यूनिट परीक्षण के लिए नया हूं और मेरे पास यह सवाल है कि यदि मेरा कोड उपयोग कर रहा है तो परीक्षण कैसे करें gets विधि, लेकिन उपयोगकर्ता इनपुट के लिए संकेत दिए बिना।

यहाँ कोड मैं परीक्षण करने की कोशिश कर रहा हूँ। यहाँ कुछ भी पागल नहीं है, बस एक साधारण एक लाइनर है।

my_file.rb

My_name = gets

यहाँ मेरी कल्पना है।

require "stringio"

def capture_name
$stdin.gets.chomp
end

describe "capture_name" do
before do
$stdin = StringIO.new("John Doen")
end

after do
$stdin = STDIN
end

it "should be "John Doe"" do
expect(capture_name).to be == "John Doe"
require_relative "my_file.rb"
end
end

अब यह कल्पना काम करती है, लेकिन जब मैं इसे कोड चलाता हूंउपयोगकर्ता इनपुट के लिए संकेत। मैं यह नहीं चाहता कि मैं ऐसा करूं। यदि परीक्षण विधि कहा जा रहा है तो मैं बस परीक्षण करना चाहता हूं और संभवत: उपयोगकर्ता इनपुट का मजाक उड़ाऊंगा। यह सुनिश्चित करने के लिए नहीं कि आरएसपीईसी में इसे कैसे प्राप्त किया जाए। पायथन में मैं इसका उपयोग करूंगा। unittest.mock RSpec में एक समान विधि है?

अग्रिम में धन्यवाद!

उत्तर:

जवाब के लिए 2 № 1

यहाँ आप कैसे ठूंठ सकते हैं gets आपके वापसी मूल्य के साथ।

require "rspec"

RSpec.describe do
describe "capture_name" do
it "returns foo as input" do
allow($stdin).to receive(:gets).and_return("foo")
name = $stdin.gets

expect(name).to eq("food")
end
end
end

Failures:

1)   should eq "food"
Failure/Error: expect(name).to eq("food")

expected: "food"
got: "foo"

(compared using ==)

यह जांचने के लिए कि क्या कुछ कहा जा रहा है (जैसे कि कोई फ़ंक्शन) आप उपयोग कर सकते हैं expect($stdin).to receive(:gets).with("foo") यह सुनिश्चित करने के लिए कि इसे सही आर्ग के साथ (एक बार) कहा जा रहा है। इस परिदृश्य में उम्मीद की रेखा से पहले जाना है name = $stdin.gets.