A
및 모의 인터페이스 InterfaceB
을 테스트하려면 A
을 작성하여 InterfaceB
인스턴스를 생성 할 필요가 없도록해야합니다. 대신 생성자를 통해 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();
}
}
이것은 의존성 주입이라고합니다. 이는 클래스의 종속성이 클래스를 작성하는 클래스가 아니라 클래스에 "주입"된다는 것을 의미합니다. 이와 같이 생성자에 주입 할 때 "생성자 삽입"이라고도하지만 일반적으로 "종속성 주입"입니다. 그리고 당신이 물어 보는 것과 같은 인터페이스를 조롱 할 수 있다는 것이 왜 우리가 사용하는 이유 중 하나입니다.
몇 가지 중요한 세부 사항 :
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 같은 종속성 주입 컨테이너의 컨텍스트에있는 경우가 많습니다. 그것들은 의존성 주입 작업을하도록 도와주는 유용한 도구입니다. 그들은 배울만한 가치가 있습니다.하지만 의존성 주입은 위의 예제에서 종속성 (InterfaceB
)을 클래스 A
에 "주입"하는 것과 같이 클래스를 작성하는 방법에 관한 것입니다.
, 당신은 직접 그 생성자에 조롱 개체'InterfaceB'를 전달하거나 설정할 수 있습니다 DI 검사를 사용하는 경우 주사를 위해서만 사용하십시오. – starlight54