आप की एक वास्तविक उदाहरण के लिए के माध्यम से M1
पास करने के लिए कॉल देना चाहिए M2
विधि।
सामान्य रूप से, आपको ब्लैक बॉक्स अपने वर्गों के व्यवहार का परीक्षण करना चाहिए। आपके परीक्षणों पर ध्यान नहीं दिया जाना चाहिए कि M1
M2
पर कॉल करने के लिए होता है - यह एक कार्यान्वयन विवरण है।
यह मजाक बाहरी निर्भरता (आपको क्या करना चाहिए जो) के रूप में ही नहीं है ...
उदाहरण के लिए, मैं इस तरह एक वर्ग है:
class AccountMerger
{
public AccountMerger(IAccountDao dao)
{
this.dao = dao;
}
public void Merge(Account first, Account second, MergeStrategy strategy)
{
// merge logic goes here...
// [...]
dao.Save(first);
dao.Save(second);
}
public void Merge(Account first, Account second)
{
Merge(first, second, MergeStrategy.Default);
}
private readonly IAccountDao dao;
}
मैं अपने परीक्षणों को यह दिखाने के लिए चाहता हूं कि:
कॉलिंग Merge(first, second, strategy)
परिणामस्वरूप दो खाते सहेजे जा रहे हैं जिन्हें आपूर्ति किए गए नियम का उपयोग करके विलय कर दिया गया है।
कॉलिंग Merge(first, second)
परिणामस्वरूप दो खाते सहेजे गए हैं जिन्हें डिफ़ॉल्ट नियम का उपयोग करके विलय कर दिया गया है।
ध्यान दें कि इन आवश्यकताओं के दोनों आदानों और प्रभाव के संदर्भ में phrased रहे हैं - विशेष रूप से, मुझे परवाह नहीं है कैसे वर्ग इन परिणामों को प्राप्त होता है, जब तक यह करता है।
तथ्य यह है कि दूसरी विधि का उपयोग करने के लिए पहली विधि होती है, जिसकी मुझे परवाह नहीं है, या यहां तक कि मैं इसे लागू करना चाहता हूं - अगर मैं ऐसा करता हूं, तो मैं बहुत भंगुर परीक्षण लिखूंगा। (यहां तक कि एक तर्क भी है कि यदि आपने किसी मॉकिंग फ्रेमवर्क का उपयोग करके परीक्षण के तहत ऑब्जेक्ट के बारे में गड़बड़ की है, तो आप मूल ऑब्जेक्ट का परीक्षण भी नहीं कर रहे हैं, तो क्या आप परीक्षण कर रहे हैं?) यह एक आंतरिक निर्भरता कि काफी खुशी से आवश्यकताओं को तोड़ने के बिना बदल सकता है:
// ...
// refactored AccountMerger methods
// these still work, and still fulfil the two requirements above
public void Merge(Account first, Account second, MergeStrategy strategy)
{
MergeAndSave(first, second, strategy ?? MergeStrategy.Default);
}
public void Merge(Account first, Account second)
{
// note this no longer calls the other Merge() method
MergeAndSave(first, second, MergeStrategy.Default);
}
private void MergeAndSave(Account first, Account second, MergeStrategy strategy)
{
// merge logic goes here...
// [...]
dao.Save(first);
dao.Save(second);
}
// ...
जब तक मेरी परीक्षण केवल इनपुट और प्रभाव की जाँच, मैं आसानी से पुनर्रचना के इस प्रकार कर सकते हैं - मेरी परीक्षण भी मदद मिलेगी मुझे ऐसा करने के लिए, क्योंकि वे सुनिश्चित करते हैं कि परिवर्तन करने के दौरान मैंने वर्ग को तोड़ा नहीं है।
दूसरी ओर, मैं किसी मर्ज (हालांकि AccountMerger
डीएओ के कार्यान्वयन के बारे में परवाह नहीं करना चाहिए, यह एक Save()
विधि है ही नहीं।) यह डीएओ है निम्न खातों को बचाने के लिए IAccountDao
का उपयोग कर के बारे में क्या AccountMerger
मॉकिंग के लिए एक प्रमुख उम्मीदवार - बाहरीAccountMerger
वर्ग की निर्भरता, प्रभाव महसूस करना मैं कुछ इनपुट के लिए जांचना चाहता हूं।
क्या आप स्पष्ट कर सकते हैं कि इसमें शामिल मूल कक्षाएं हैं या नहीं? –
@ रूबेन: मेरे मामले में कोई आधार वर्ग (कक्षा सी)। –