2016-06-29 13 views
1

私は以下のコードを抜いてしまったので、typemockを使ってテストしようとしましたが、InvalidCast例外があります。 ISomeClassは単なるインタフェースであり、SomeClassはそのインタフェースを実装しています。 UseOfSomeClassはSomeClassを使用する別のクラスで、そのコンストラクタはSomeClassをパラメータとして受け取ります。 UseOfSomeClassをテストする必要があります。 typemockの偽のオブジェクトをクラスコンストラクタに挿入するにはどうすればよいですか?typemock throw 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

「ISomeClass」の代わりに「SomeClass」を嘲笑してはいけませんか? –

+0

はい。私がSomeClassを模倣すれば、うまくいく。しかし、なぜ私はISomeClassを模倣すべきではないのですか?あるいは、インターフェイスを模擬して具体的なクラスを模擬するときはどうすればよいですか? – iceheart

+0

クラスコンストラクタが 'SomeClass'を必要とする場合、' SomeClass'をモックする必要があります。 'ISomeClass'が必要な場合は、' ISomeClass'をモックする必要があります。通常、依存性注入を行うときは、 'SomeClass'の代わりに' ISomeClass'をコンストラクタで受け入れるように 'UseOfSomeClass'を変更する方がよいでしょう。実際には、クラスに似た名前のインターフェイスを持つべきではありません。クラスが実装するコントラクトを表す必要があります。 –

答えて

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); 
} 
関連する問題