۱۳۹۰/۰۲/۰۵

تهيه آزمون واحد جهت كار با محتواي فايل‌ها


يكي از شروط تهيه‌ آزمون‌هاي واحد، خارج نشدن از مرزهاي سيستم در حين بررسي آزمون‌هاي مورد نظر است؛ تا بتوان تمام آزمون‌ها را با سرعت بسيار بالايي، بدون نگراني از در دسترس نبودن منابع خارجي، درست در لحظه انجام آزمون‌ها، به پايان رساند. اگر اين خروج صورت گيرد، بجاي unit tests با integration tests سر و كار خواهيم داشت. در اين ميان، كار با فايل‌ها نيز مصداق بارز خروج از مرزهاي سيستم است.
براي حل اين مشكل راه حل‌هاي زيادي توصيه شده‌اند؛ منجمله تهيه يك اينترفيس محصور كننده فضاي نام System.IO و سپس استفاده از فريم ورك‌هاي mocking و امثال آن. يك نمونه از پياده سازي آن‌را اينجا مي‌توانيد پيدا كنيد : (+)
اما راه حل ساده‌تري نيز براي اين مساله وجود دارد و آن هم افزودن فايل‌هاي مورد نظر به پروژه آزمون واحد جاري و سپس مراجعه به خواص فايل‌ها و تغيير Build Action آن‌‌ها به Embedded Resource مي‌باشد. به اين صورت پس از كامپايل پروژه، فايلهاي ما در قسمت منابع اسمبلي جاري قرار گرفته و به كمك متد زير قابل دسترسي خواهند بود:
using System.IO;
using System.Reflection;

public class UtHelper
{
public static string GetInputFile(string filename)
{
var thisAssembly = Assembly.GetExecutingAssembly();
var stream = thisAssembly.GetManifestResourceStream(filename);
return new StreamReader(stream).ReadToEnd();
}
}

نكته‌اي را كه اينجا بايد به آن دقت داشت، filename متد GetInputFile است. چون اين فايل ديگر به صورت متداول از فايل سيستم خوانده نخواهد شد، نام واقعي آن به صورت namespace.filename مي‌باشد (همان نام منبع اسمبلي جاري).
اگر جهت يافتن اين نام با مشكل مواجه شديد، تنها كافي است اسمبلي آزمون واحد را با برنامه Reflector يا ابزارهاي مشابه گشوده و نام منابع آن‌را بررسي كنيد.