के साथ लपेटना सी ++ फ़ंक्शंस मुझे कार्यों को लपेटने के लिए जीएनयू लिंकर कार्यक्षमता पसंद है। मैं आमतौर पर इसे नकली उदाहरण का उपयोग करता हूं nondeterministic समारोह रैंड() की तरह कहते हैं। निम्नलिखित उदाहरण पर विचार जहाँ मैं giveMeANumber के लिए एक इकाई परीक्षण लिखने के लिए करना चाहते हैं:जीएनयू लिंकर
//number.cpp
int giveMeANumber() {
return rand() % 6 + 1;
}
मैं इस तरह जीएनयू लिंकर कार्यप्रणाली चादर के साथ रैंड करने के लिए कॉल लपेट कर सकते हैं:
//test.cpp
extern "C" int __wrap_rand(void) {
return 4;
}
void unitTest() {
assert giveMeANumber() == 5;
}
$ g++ test.cpp -o test number.o -Xlinker --wrap=rand
वहाँ कोई तरीका है सामान्य सी ++ कार्यों के साथ ऐसा करने के लिए? निम्नलिखित काम नहीं करता है, मुझे लगता है कि यह नाम उलझन की वजह से है। लेकिन जब भी मैं उलझन वाले नाम से कोशिश करता हूं तो यह काम नहीं करता है।
//number.cpp
int foo() {
//some complex calculations I would like to mock
}
int giveMeANumber() {
return foo() % 6 + 1;
}
//test.cpp
extern "C" int __wrap_foo(void) {
return 4;
}
$ g++ test.cpp -o test number.o -Xlinker --wrap=foo
कोई विचार?
वास्तव में, रैंड एक निर्धारक कार्य है। यह एक छद्म यादृच्छिक संख्या अनुक्रम देता है। रैंड कहते हैं कि रैंड एसआरएंड के साथ इस्तेमाल किए गए किसी भी बीज के लिए संख्याओं के समान अनुक्रम को वापस कर देगा। – TJD
ठीक है, ब्रावो, यह सच है। लेकिन उदाहरण को छोटा और पठनीय रखने के लिए, मैंने बीज का उपयोग नहीं किया। – Mike
आपको 'getRandomNumber'' के लिए '__wrap_foo' का नाम बदलने की आवश्यकता है। (http://xkcd.com/221/) –