2014-02-13 144 views
4

我試圖測試下面的代碼:如何用JustMock模擬構造函數?

public ICollection<RawCatalog> ReadCatalog(string familyName) 
{ 
    // Root folder for the family 
    string familyFolder = this.GetFamilyFolder(familyName); 
    DirectoryInfo familyFolderInfo = new DirectoryInfo(familyFolder); 

    foreach (DirectoryInfo subFamilyFolderInfo in familyFolderInfo.EnumerateDirectories()) 
    { 
     // Do stuff 
    } 
} 

我預期這將工作:

// Arrange 
DirectoryInfo fakeDirectoryInfo = Mock.Create<DirectoryInfo>(Constructor.Mocked); 
Mock.Arrange(() => new DirectoryInfo(@"testRoot\DrivesData\TestFamily")).Returns(fakeDirectoryInfo); 
Mock.Arrange(() => directoryInfo.EnumerateDirectories()).Returns(new DirectoryInfo[] { }); 

但不工作作爲似乎沒有在構造函數返回fakeDirectoryInfo。我該如何做測試? (如果可能的話,我不應該改變源代碼,因爲它是有效的代碼)。

我讀過一些關於未來嘲笑和使用DoNothing(),但不知道這是否適用於我自己的情況。

在此先感謝。

+1

排號的'new'表達式返回值是我們的名單上相當高的特點,將要,但它不會傷害,如果你在JustMock投贊成票反饋網站:http://feedback.telerik.com/Project/105/Feedback/Details/126623-arrange-return-value-of-new-expressions –

回答

2

以供將來參考:

不幸的是,在一個構造函數截取安排返回值是不可能的

JustMock.Mock.Arrange(() => new DirectoryInfo(@"testRoot\DrivesData\TestFamily")).Returns(fakeDirectoryInfo);) 

如果沒有需要區分情況下,你可以使用這樣的:

Mock.Arrange(() => new DirectoryInfo(passedString)).DoNothing(); 

而在安排調用使用.IgnoreInstance()方法。這將導致像一個電話:

Mock.Arrange(() => fakeDirectoryInfo.EnumerateDirectories()).IgnoreInstance().Returns(new DirectoryInfo[] { });