मैं 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
.