2012-09-27 3 views
5

मैं कुछ सी ++ कोड पर यूनिट परीक्षण करने की कोशिश कर रहा हूं लेकिन कुछ परेशानी में भाग रहा हूं।क्यों दावा नहीं करता :: वीएस यूनिट टेस्टिंग फ्रेमवर्क में AreEqual std :: string के साथ काम करता है?

मैं कोड के निम्नलिखित लाइनों के लिए इसी तरह कुछ है ...

std::string s1 = obj->getName(); 
std::string s2 = "ExpectedName"; 
Assert::AreEqual(s1, s2, "Unexpected Object Name"); 

और मैं निम्नलिखित संकलक त्रुटि मिल रही है ...

error C2665: 'Microsoft::VisualStudio::TestTools::UnitTesting::Assert::AreEqual' : 
none of the 15 overloads could convert all the argument types 

ऐसा लगता है जैसे कि यह एक होना चाहिए the following overload के साथ मेल:

AreEqual<(Of <(T>)>)(T, T, String) 

ऊपर अधिभार एक टेम्पलेट अधिभार नहीं है किसी भी वस्तु का समर्थन करना चाहिए, जब तक तर्क 1 और 2 एक ही प्रकार के होते हैं? या क्या मैं कुछ न कुछ भूल रहा हूं?

क्या कोई अन्य तरीका है कि मैं इस आर्ट को पूरा कर सकता हूं?

उत्तर

1

मैं इतना है कि पूर्णांक के बजाय तार की तुलना की जाती है एक समाधान का एक सा हैक की गई:

Assert::AreEqual(0, s1.compare(s2), "Unexpected Object Name"); 

भविष्य में, हम मूल सी ++ इकाई परीक्षण में स्विच करेंगे, लेकिन इस बीच, यह चाल है। जाहिर है इसके लिए संदेश बहुत उपयोगी नहीं है

Assert.AreEqual failed. Expected:<0>. Actual:<1>. Unexpected Trajectory Name 

लेकिन यह कुछ भी नहीं है।

+2

एक और कामकाज (केवल अतिरिक्त प्रयास किए बिना तारों के लिए) [अंतर्निर्मित मार्शलिंग लाइब्रेरी] (http://msdn.microsoft.com/en-us/library/bb384865 (VS.100) .aspx का उपयोग करना होगा): 'जोर दें :: AreEqual (marshal_as (एस 1), marshal_as (एस 2), एल" अप्रत्याशित वस्तु नाम ");'। +1 हालांकि, मुझे लगता है कि आपका कामकाज रचनात्मक है। : -] – ildjarn

4

आप देशी प्रकार के साथ कामयाब इकाई परीक्षण ढांचे का उपयोग करने के लिए प्रयास कर रहे हैं - यह केवल पहला कामयाब प्रकार में वस्तुओं प्रमुखता के बिना काम करने के लिए नहीं जा रहा है।

वीएस2012 अब native C++ unit testing framework के साथ आता है; बजाय इस ढांचे का उपयोग कर, अपने कोड एक विस्तृत स्ट्रिंग के लिए "Unexpected Object Name" बदलते (L साथ उपसर्ग) और the following overload फोन करके काम कर सकता था:

template<typename T> 
static void AreEqual(
    const T& expected, 
    const T& actual, 
    const wchar_t* message = NULL, 
    const __LineInfo* pLineInfo = NULL) 
+0

मैं स्पष्टीकरण की सराहना करता हूं कि यह क्यों काम नहीं कर रहा है, लेकिन मेरे पास वीएस2012 तक पहुंच नहीं है। – sgryzko

+0

@sgryzko: फिर आपकी सबसे अच्छी शर्त कुछ तीसरे पक्ष के देशी सी ++ परीक्षण ढांचे का उपयोग करना है - देशी प्रकारों का परीक्षण करने के लिए एक प्रबंधित ढांचे का उपयोग करना इसके लायक से 2000% अधिक प्रयास है। [बूस्ट.स्ट] (http://www.boost.org/libs/test/) एक अच्छी शुरुआत हो सकती है। – ildjarn

+0

क्या मैं बूस्ट.स्ट के बजाय [xUnit ++] (https://bitbucket.org/moswald/xunit) सुझा सकता हूं?यह (मेरी स्वीकार्य पक्षपातपूर्ण राय में) शुरू करने के लिए थोड़ा आसान है। – moswald

3

हम संयुक्त राष्ट्र से प्रबंधित सी ++ में रहने के लिए कोशिश कर रहे हैं, और हम परवाह नहीं है क्या त्रुटि संदेश की तरह दिखता है, यह शायद स्वीकार किए जाते हैं जवाब से एक बेहतर विकल्प है:

Assert::IsTrue(s1==s2)

तक बेहतर, मेरा मतलब है कि इसे पढ़ना कम से कम आसान है।

0

मेरा मानना ​​है कि समाधान हमें स्ट्रिंग

 Assert::AreEqual<bool>(true, dict->IsBeginWith("", ""), L"Empty"); 

आप भी इस, जो आप गलत परिणाम दे जैसे कि यह मामला कोशिश कर सकते हैं, लेकिन इस मुद्दे की समझ की सही दिशा के लिए नेतृत्व से पहले एल उपसर्ग है

Assert::AreEqual<bool>(true, dict->IsBeginWith("", ""), (wchar_t*)"Empty"); //Empty 
    Assert::AreEqual(true, dict->IsBeginWith("A", "A"), (wchar_t*)"Empty2"); 
    Assert::AreEqual(true, dict->IsBeginWith("A", "a"), (wchar_t*)""); //CAPITAL LETTER Check 
संबंधित मुद्दे