2010-09-08 50 views
4

我希望能夠正確地測試一個類初始化使用起訂量:起訂量和構造 - 測試初始化​​行爲

class ClassToTest 
{ 
    public ClassToTest() 
    { 
     Method1(@"C:\myfile.dat") 
    } 

    public virtual void Method1(string filename) 
    { 
     // mock this method 
     File.Create(filename); 
    } 
} 

我想我可以使用CallBase屬性創建一個可測試版然後使用.Setup()確保Method1()不執行任何代碼。

但是,創建Mock<ClassToTest>()不會調用構造函數,如果它做到了,就不會執行Setup()

如果這是不可能的,那麼在確保構造函數行爲正確的同時解決問題的最佳方式是什麼?

編輯:爲了使它更清晰,我添加了一個參數Method1()採取文件名並添加了一些行爲。我想編寫測試將是對以下工作版本:

[Test] 
public void ClassToTest_ShouldCreateFileOnInitialisation() 
{ 
    Mock<ClassToTest> mockClass = new Mock<ClassToTest>() { CallBase = true }; 
    mockClass.Setup(x => x.Method1(It.IsAny<string>()); 

    mockClass.Verify(x => x.Method1(@"C:\myfile.dat")); 
} 
+5

在你走下這條路之前,請看看你的設計實踐。不建議在構造函數中調用虛擬方法,因爲它可能會導致難以跟蹤的非常微妙的錯誤。有關詳細信息,請參閱http://stackoverflow.com/questions/448258/calling-virtual-method-in-base-class-constructor。 – 2010-09-08 12:49:12

+0

Method1()在做什麼,你需要模擬? – 2010-09-08 12:49:47

+0

如果可以,請不要在構造函數中調用虛擬方法。如果你不能,你能否粘貼你的測試? – Grzenio 2010-09-08 13:49:49

回答

9

這樣下來的Moq.Mock(實際上是CastleProxyFactoryMoq用途內)內

mockClass.Object 

將調用構造函數的Activator.CreateInstance()

方式,使您的測試看起來像

[Test] 
public void ClassToTest_ShouldCreateFileOnInitialisation() 
{ 
    Mock<ClassToTest> mockClass = new Mock<ClassToTest>(); 
    mockClass.Setup(x => x.Method1(It.IsAny<string>()); 

    var o = mockClass.Object; 

    mockClass.Verify(x => x.Method1(@"C:\myfile.dat")); 
}