2016-06-29 93 views
1

我有下面的代碼剪斷,我試圖用typemock測試它,但得到了InvalidCast異常。 ISomeClass只是一個接口,SomeClass實現了這個接口。 UseOfSomeClass是另一個使用SomeClass的類,其構造函數以SomeClass作爲參數。我需要測試UseOfSomeClass。如何將typemock假對象注入到類構造函數中?typemock扔InvalidCast異常

public interface ISomeClass 
{ 
    void DoSomething(); 
} 

public class SomeClass : ISomeClass 
{ 
    public void DoSomething() 
    { 
     Console.WriteLine("Do something!"); 
    } 
} 

public class UseOfSomeClass 
{ 
    public SomeClass SomeClassProperty { get; set; } 

    public bool IsChecked { get; set; } 

    public UseOfSomeClass(SomeClass someClass) 
    { 
     SomeClassProperty = someClass; 
    } 

    public void MyMethod() 
    { 
     SomeClassProperty.DoSomething(); 

     IsChecked = true; 
    } 
} 

然後測試:

[TestClass] 
public class UseOfSomeClassTest 
{ 
    [TestMethod] 
    public void TestMethod1() 
    { 
     var fakeSomeClass = Isolate.Fake.Instance<ISomeClass>(); 

     var use = new UseOfSomeClass((SomeClass)fakeSomeClass); 

     use.MyMethod(); 

     Assert.IsTrue(use.IsChecked); 
    } 
} 

謝謝!

+0

難道你不應該嘲笑'SomeClass'而不是'ISomeClass'嗎? –

+0

是的。如果我嘲笑SomeClass,它工作正常。但爲什麼我不應該嘲笑ISomeClass?或者什麼時候應該模擬一個接口,以及什麼時候模擬一個具體的類? – iceheart

+0

如果類構造函數需要'SomeClass',則需要模擬'SomeClass'。如果它需要一個'ISomeClass',你需要模擬'ISomeClass'。通常,當你進行依賴注入時,你應該更改'UseOfSomeClass'來接受構造函數中的'ISomeClass'而不是'SomeClass'。實際上,你不應該有類似於類的接口,它應該代表類實現的合約。 –

回答

0

Typemock Isolator允許你模擬具體的類,所以在你的測試用例中不需要僞造ISomeClass。您可以僞造SomeClass並將其作爲參數發送給ctor。

[TestMethod, Isolated] 
public void TestMethod1() 
{ 
    var fakeSomeClass = Isolate.Fake.Instance<SomeClass>(); 

    var use = new UseOfSomeClass(fakeSomeClass); 

    use.MyMethod(); 

    Assert.IsTrue(use.IsChecked); 
} 
相關問題