कारण कोड कवर किया जा रहा के रूप में नहीं दिखाया गया है कि कैसे async तरीकों लागू किया जाता है के साथ क्या करना है। सी # संकलक वास्तव में एक वर्ग है कि एक राज्य मशीन को लागू करता है में async तरीकों में कोड तब्दील हो, और एक ठूंठ कि प्रारंभ और कहा कि राज्य मशीन का आह्वान में मूल विधि बदल देती है। चूंकि यह कोड आपकी असेंबली में उत्पन्न होता है, इसलिए यह कोड कवरेज विश्लेषण में शामिल है।
यदि आप उस कार्य का उपयोग करते हैं जो कोड को कवर करने के समय पूरा नहीं होता है, तो संकलक-जेनरेट की गई राज्य मशीन कार्य पूरा होने पर फिर से शुरू करने के लिए पूर्ण कॉलबैक को हुक करता है। यह पूरी तरह से राज्य मशीन कोड का उपयोग करता है, और परिणामस्वरूप पूर्ण कोड कवरेज (कम से कम कथन-स्तर कोड कवरेज टूल के लिए)।
एक आम तरीका है एक काम उस पल में पूरा नहीं हुआ है प्राप्त करने के लिए, लेकिन कुछ बिंदु पर पूरा हो जाएगा अपने इकाई परीक्षण में Task.Delay उपयोग करने के लिए है। हालांकि, कि आम तौर पर एक गरीब विकल्प है क्योंकि समय देरी है या तो (अप्रत्याशित कोड कवरेज में और परिणाम क्योंकि कभी-कभी काम पूरा हो गया है इससे पहले कि कोड परीक्षण किया जा रहा है चलाता है) बहुत छोटा या बहुत बड़ा है (अनावश्यक रूप से परीक्षण धीमा) है।
एक बेहतर विकल्प का उपयोग करने के लिए है "का इंतजार है Task.Yield()"। यह तुरंत वापस आ जाएगा, लेकिन जैसे ही यह सेट हो रहा है, निरंतरता का आह्वान करें।
एक और विकल्प - हालांकि कुछ हद तक बेतुका - अपने स्वयं के प्रतीक्षा करने योग्य पैटर्न को कार्यान्वित करना है जिसमें निरंतर रिपोर्टिंग के अर्थशास्त्र को निरंतर कॉलबैक तक लगाया जाता है, और फिर तुरंत पूरा हो जाता है। यह मूल रूप से राज्य मशीन को एसिंक पथ में मजबूर करता है, जो पूर्ण कवरेज प्रदान करता है।
यह सुनिश्चित करने के लिए, यह एक सही समाधान नहीं है। सबसे दुर्भाग्यपूर्ण पहलू यह है कि इसे किसी उपकरण की सीमा को संबोधित करने के लिए उत्पादन कोड में संशोधन की आवश्यकता होती है। मैं बहुत पसंद करता हूं कि कोड कवरेज टूल कंपाइलर द्वारा उत्पन्न एसिंक स्टेट मशीन के हिस्सों को अनदेखा करता है। लेकिन जब तक ऐसा नहीं होता है, तो यदि आप वास्तव में पूर्ण कोड कवरेज प्राप्त करने का प्रयास करना चाहते हैं तो कई विकल्प नहीं हैं।
एक इस हैक के अधिक पूर्ण विवरण के यहां पाया जा सकता है: http://blogs.msdn.com/b/dwayneneed/archive/2014/11/17/code-coverage-with-async-await.aspx
स्रोत
2014-11-19 05:07:46
तरीकों सब पूरा कर रहे हैं, और परीक्षण से गुजर रहे हैं। ऐसा लगता है कि मुझे उपकरण की सीमा का सामना करना पड़ रहा है। – Jacob
ठीक है, लेकिन 'इंतजार' के बिंदु पर ऑपरेशन पहले से ही पूरा हो चुके हैं? –
गोटा ... तो आपको इंतजार करने के प्रत्येक उदाहरण के लिए वास्तव में उन परिदृश्यों का परीक्षण करना होगा? यदि आपके पास 5 इंतजार के साथ कोई तरीका है, तो आपको 100% कवरेज प्राप्त करने के लिए कम से कम 15 परीक्षण केस लिखना होगा? यह मेरे लिए एक बग की तरह लगता है। ऐसा लगता है कि आपके कोड का परीक्षण करने से कंपाइलर द्वारा उत्सर्जित एसिंक तंत्र का परीक्षण करना मेरे लिए अधिक लगता है। – Jacob