ठीक है, अगर आईओ के बजाए, तो आपने एक मोनैड का उपयोग किया जो पूरी तरह से नियंत्रित और निर्धारित वातावरण के साथ I/O अनुकरण करता है? आप आसानी से उन "आईओ" कार्यों का परीक्षण कर सकते हैं जैसे कि वे शुद्ध कार्य थे। इस उदाहरण IOSpec, जो आप ठीक प्रभाव किस तरह आप अपने नकली आईओ में अनुमति देना चाहते हैं निर्दिष्ट करने की अनुमति देकर भी आगे चला जाता है के लिए के पीछे विचार यह है कि आप लिख सकते हैं:
myFunction :: a -> b -> IOSpec (Teletype :+: IORefS)
myFunction x y = do
...
putStr (...)
ref <- newIORef ...
...
(टेलिटाइप टर्मिनल कार्यों के लिए अनुमति देते हैं संदर्भ के लिए IORefS) और उसके बाद इनपुट और आउटपुट पर पूर्ण नियंत्रण के साथ या यहां तक कि जीएचसीआई में चरणबद्ध कदम के साथ एक त्वरित जांच संपत्ति में अपने फ़ंक्शन का परीक्षण करें (VM मॉड्यूल और runIOSpec देखें)। और यदि यह सही तरीके से काम करता है, तो बस टेस्ट। IOSpec.Surrogate पेश करने के लिए आयात को बदलें जो IOSpec f को IO के समानार्थी के रूप में परिभाषित करता है।