2017-01-23 7 views
6

अभी मेरे पास यूनिट परीक्षण हैं जो "फ़कर" कंपनी नाम का उपयोग करने में विफल रहे हैं।Apperophe कैरेक्टर के साथ असफल रुपये नियंत्रक परीक्षण?

ऐसा लगता है कि expect(response.body).to match(@thing.name) क्या गड़बड़ हो रहा है।

त्रुटि को देखते समय, फ़कर कंपनी के नामों में कभी-कभी "O'Brian Company" या "O'Hare Company" जैसी चीज़ें होती हैं।

फ़ेकर एक एन्कोडेड स्ट्रिंग है? चूंकि मुझे पता है कि एन्कोडेड तारों से मिलान करना अच्छा नहीं है, और मैं वास्तव में फैक्टरी आईएम का उपयोग करके एक विशिष्ट कंपनी का नाम निर्दिष्ट नहीं करना चाहता हूं।

धन्यवाद

+0

मुझे उत्सुकता है कि आपको ऐसा क्यों लगा कि मेरा जवाब पर्याप्त नहीं था। मैं कुछ भी स्पष्ट कर सकता हूँ? –

+0

इसमें शामिल समस्या यह है कि यदि इसमें "इसमें शामिल है", तो मैं इसे पूरी तरह से मिलान करना चाहता हूं और न कि केवल नाम के भीतर "मौजूद" शब्द। हालांकि मैं इसे फॉलबैक के रूप में उपयोग कर सकता हूं, जिसमें बीमार आपके उत्तर को सही चिह्नित करता है :)। मैं वास्तव में बस अन्य संभावनाओं की तलाश करने की कोशिश कर रहा हूँ। – msmith1114

उत्तर

5

फ़ेकर आपके लिए कोई एन्कोडिंग नहीं करेगा। यह आपको O'Malley जैसी स्ट्रिंग देगा। लेकिन प्रतिक्रिया में HTML escaping (या प्रारूप के आधार पर कुछ अन्य प्रकार) होना चाहिए, जैसे O'Malley। सुनिश्चित करने के लिए आप हमेशा puts response.body कर सकते हैं।

आरएसपीसी matches मैचर वास्तव में for either expected or actual to be a regular expression डिज़ाइन किया गया है, लेकिन आपके मामले में दोनों तार हैं। क्योंकि कोड has an optimization calling values_match? जो does a simple comparison है, आप प्रभावी रूप से expect(response.body).to eq(@thing.name) कह रहे हैं।

यदि आप नियमित अभिव्यक्ति चाहते हैं, तो आप सही हैं कि इसे अनियंत्रित मानों का उपयोग करके सावधान रहना चाहिए। सौभाग्य से रूबी के लिए Regexp.escape है, तो आप Regexp.new("foo" + Regexp.escape(@thing.name) + "bar") कह सकते हैं। लेकिन आपके आपत्ति से include पर, ऐसा लगता है कि आप वास्तव में प्रतिक्रिया के अलावा कुछ भी नहीं चाहते हैं, सही? उस स्थिति में, आपको बिल्कुल रेगेक्स की आवश्यकता नहीं है।

किसी भी मामले में, समस्या के बारे में नाम के बारे में नहीं है, लेकिन नाम कैसे बच निकला है। तो तुलना करने से पहले आपको या तो (1) प्रतिक्रिया को डीकोड करना चाहिए या (2) फ़कर स्ट्रिंग को एन्कोड करना चाहिए। यह वास्तव में कोई फर्क नहीं पड़ता। दोनों बहुत आसान कर रहे हैं:

expect(CGI.unescapeHTML(response.body)).to eq @thing.name 

या

expect(response.body).to eq CGI.escapeHTML(@thing.name) 

स्वाभाविक रूप से, अगर आप अपनी प्रतिक्रिया JSON है, तो आप इस सभी HTML JSON के साथ सामान से बचने, आदि

+0

त्वरित प्रश्न: यह "उम्मीद" कार्यों में यह सीजीआई क्या है। क्या वह उन्हें एन्कोडिंग करता है? – msmith1114

+0

सीजीआई रूबी मानक पुस्तकालय का हिस्सा है: https://ruby-doc.org/stdlib-2.3.0/libdoc/cgi/rdoc/CGI.html –

3

आप #match का उपयोग करने के बजाय #include का उपयोग करने का प्रयास कर सकते हैं। समस्या है, तो केवल जब तुम ठग से नाम के इस प्रकार मिलता है, तो आप इस पर एक नज़र रखना चाहिए, इसके अलावा

expect(response.body).to match(Regexp.new(@thing.name)) 

:

expect(response.body).to include(@thing.name) 
2

आप स्ट्रिंग के बजाय एक Regexp गुजर कोशिश कर सकते QA, यह कुछ अच्छी अंतर्दृष्टि देता है।

+0

मुझे लगता है कि इसका उपयोग न करने में समस्या है, क्या मुझे बहुत सारे नमूना परीक्षण डेटा को परिभाषित करने की आवश्यकता होगी। लेकिन एक तरह से यह अच्छा है क्योंकि यह उदाहरण के लिए अजीब मूल्यों के साथ मुद्दों को दिखाता है। – msmith1114

2

मान लिया जाये कि आप की बात कर रहे बदलना चाहिए Faker::CompanyFaker मणि

आपकी उदाहरण अपेक्षा पास करने का सही तरीका Regexp का उपयोग करना होगा जैसा कि @rafael-costa उदाहरण में है। ऐसा करने से एस्ट्रोफ़ेस जैसी चीज़ों से बच निकलती है।

फ़कर का उपयोग करने में समस्या यह है कि आपके परीक्षण निर्धारित नहीं हैं।अपने परीक्षण के लिए स्थैतिक, ज्ञात इनपुट प्रदान करना सबसे अच्छा अभ्यास है और उम्मीद है कि आउटपुट उन इनपुट के आधार पर कुछ अपेक्षाओं को पारित करने की अपेक्षा करें। यह इस तरह से अधिक जानकारी लेकिन शायद कुछ के बिना एक उचित उदाहरण प्रदान करने के लिए मुश्किल है:

company = Company.new(name: 'Acme Anvils') 
get :show, params: {id: company.to_param}, session: {} 
expect(response.body).to match(Regexp.new('Acme Anvils', Regexp::MULTILINE)) 

इसके अलावा, आप आमतौर पर अपने नियंत्रक चश्मा के भीतर विशिष्ट शरीर उत्पादन का परीक्षण नहीं करना चाहिए। ऐसा करने के लिए पूरे उद्देश्यों का परीक्षण कर रहा है। इसके लिए आप आमतौर पर write a view test करेंगे।

संबंधित मुद्दे