A
と模擬インターフェイスInterfaceB
をテストするには、のインスタンスを作成しないようにA
と記述する必要があります。代わりに、そのコンストラクタを通じてInterfaceB
のインスタンスを受け取ります。
あなたは何度も何度もこのパターンが表示されます:
public A()
{
private readonly InterfaceB _b;
public A(InterfaceB b)
{
_b = b;
}
public string functionA()
{
if(String.IsNullOrEmpty(_b.GetId())) return String.Empty;
else if(String.IsNullOrEmpty(_b.GetKey())) return String.Empty;
else return _b.GetToken();
}
}
これは、依存性注入と呼ばれています。つまり、クラスを作成するクラスではなく、クラスの依存関係をクラスに「注入」するということです。このようにコンストラクタに注入すると、コンストラクタインジェクションと呼ばれることもありますが、一般的には「依存性注入」です。あなたが尋ねているようなインターフェースを模擬できることは、私たちがそれを使う理由の1つです。
いくつかの重要な詳細:InterfaceB
は、コンストラクタに渡されるため
- 、
A
には何も今までに実際の実装が何であるかを「知りません」。それは何でもかまいません。その結果、A
は決して具体的な実装に結びついていません。 (だからあなたは "模擬"できるInterfaceB
)
- フィールド
_b
はreadonly
です。これは厳密には必要ではありませんが、_b
はコンストラクタからしか設定できず、再び変更されることはありません。それはA
がを受け取ってそれを使用することを強調します。このクラスは決して_b
が何であるか決して制御しません。 が何であれA
がその値が何であるかを決定します。:今、あなたはあなたが public class MockedInterfaceB : InterfaceB
{
private string _id;
private string _key;
private string _token;
public MockedInterfaceB(string id, string key, string token);
{
_id = id;
_key = key;
_token = token;
}
public string GetId() {return _id};
public string GetKey() {return _key};
public string GetToken() {return _token};
}
のように、正確に何をしたいんInterfaceB
の嘲笑の実装を作成することができます。そして、あなたのユニットテストでは、あなたがその実装を使用することができますユニットテストを書いている
var testA = new A(new MockedInterfaceB("myid","mykey","mytoken"));
Moqのようなツールを使用して、これらのモックをより簡単に作成することもできます。
依存性注入が聞こえると、それはしばしばCastle Windsor、Autofac、Unityなどの依存性注入コンテナのコンテキストにあります。これらは依存性注入作業を手助けするための便利なツールです。彼らは学ぶ価値がある。しかし、依存関係の注入は、クラスA
に依存性(InterfaceB
)を "注入"する例のように、あなたがクラスをどのように記述するかというところです。
、その後、あなたが直接そのコンストラクタに嘲笑オブジェクト 'InterfaceB'を渡すか、それを設定することができますあなたがDIを使用している場合は、そのテストのためだけであっても、注射のために必要です。 – starlight54