我想創建單元測試代碼,模擬調用.Net System.IO類,所以我可以真正進行單元測試而不是依賴於文件系統。 我正在使用SystemWrapper類來環繞BCL類。如何使用.Net IO類創建可測試的代碼?
我想獲得一個簡單的例子,看看是否存在一個文件。
我遇到的問題是,在類注射的依賴不起作用,因爲實例的依賴(通過StructureMap)需要知道通過什麼構造函數的參數,這將不提供在那個時候,也有沒有默認的構造函數。
示例代碼:
// don't want to create dependency here like so
//IFileInfoWrap fileInfoWrap = new FileInfoWrap(filename);
// using service locator (anti-pattern?!) since it can't be
// injected in this class
var fileInfoWrap = ObjectFactory.GetInstance<IFileInfoWrap>(
new ExplicitArguments(new Dictionary<string, object>
{
{"fileName", filename}
}));
Console.WriteLine("File exists? {0}", fileInfoWrap.Exists);
我不喜歡的是依賴沒有注入,ObjectFactory的不應該在這裏(但我認爲創建這個沒有別的辦法)。 ExplicitArguments使其變得混亂,參數名稱是一個魔術字符串。
,我得到這個工作StructureMap配置類需要知道我想用(我剛開始用StructureMap所以這可能不是設置它以正確的方式)顯式哪個構造:
ObjectFactory.Initialize(x =>
{
x.Scan(scan =>
{
scan.AssembliesFromPath(".");
scan.RegisterConcreteTypesAgainstTheFirstInterface();
scan.WithDefaultConventions();
});
// use the correct constructor (string instead of FileInfo)
x.SelectConstructor(() => new FileInfoWrap(null as string));
// setting the value of the constructor
x.For<IFileInfoWrap>()
.Use<FileInfoWrap>()
.Ctor<string>("fileName")
.Is(@".");
});
有沒有人找到更好的解決方案來創建System.IO類的可測試代碼? 我知道問題的一部分是在System.IO類的設計中。
SystemWrapper主要含有極其漏抽象。對Streams,TextWriter,TextReader等進行IO建模將變得簡單和容易。這些類已經是抽象的,完全消除了對SystemWrapper的需求。 – 2012-01-07 10:38:52
另一個投票流 – 2012-01-07 11:36:27
我的發現與SystemWrapper是它似乎是一個很好的接口包裝,但它仍然是一個死衚衕,因爲原始類的工作方式。 例如,返回一個FileInfo對象數組不能被正確模擬。滾動我自己更簡化的包裝,它不需要模仿現有的類,而更多的工作會導致一個可行的解決方案恕我直言。 – 2012-01-08 06:48:37