그것에 대해 두 가지 방법이 없습니다. ReSharper의 제안과 C #의 몇 가지 유용한 기능은 모든 코드에 대해 고립 된 원자 단위 테스트를 작성하는 경우 자주 사용되지 않습니다.
예를 들어, 정적 메소드가 있고이를 스텁해야하는 경우 프로파일 기반 격리 프레임 워크를 사용하지 않으면 불가능합니다. 호출 호환 해결 방법은 람다 표기법을 사용하도록 메서드의 상단을 변경하는 것입니다. 예를 들면 다음과 같습니다.
전에:
public static DBConnection ConnectToDB( string dbName, string connectionInfo ) {
}
후:
public static Func<string, string, DBConnection> ConnectToDB (dbName, connectionInfo ) {
};
둘은 통화 호환됩니다. 발신자는 변경할 필요가 없습니다. 함수의 본문은 동일하게 유지됩니다.
그런 다음 단위 테스트 코드 에서이 호출을 다음과 같이 스텁 할 수 있습니다 (데이터베이스라는 클래스에 있다고 가정).
Database.ConnectToDB = (dbName, connectionInfo) => { return null|whatever; }
완료 한 후에는 원래 값으로 교체하십시오. try / finally를 통해 또는 단위 테스트 정리에서 모든 테스트 후에 호출되는 코드를 작성하여 다음과 같이 코드를 작성할 수 있습니다.
[TestCleanup]
public void Cleanup()
{
typeof(Database).TypeInitializer.Invoke(null, null);
}
클래스의 정적 초기화 프로그램을 다시 호출합니다.
Lambda Funcs는 일반 정적 메서드만큼 지원이 풍부하지 않으므로이 방법에는 다음과 같은 바람직하지 않은 부작용이 있습니다.
- 정적 메소드가 확장 메소드 인 경우 먼저 비 확장 메소드로 변경해야합니다. Resharper는 자동으로이를 수행 할 수 있습니다.
- 정적 메서드의 데이터 형식 중 하나가 Office와 같은 내장 된 interop 어셈블리 인 경우 메서드를 래핑하거나 형식을 줄 바꿈하거나 'object'형식으로 변경해야합니다.
- 더 이상 Resharper의 변경 서명 리팩토링 도구를 사용할 수 없습니다.
그러나 정적을 모두 피하고 이것을 인스턴스 메소드로 변환한다고 가정 해 봅시다. 메소드가 가상이거나 인터페이스의 일부로 구현되지 않는 한 여전히 조롱 할 수 없습니다.
따라서 실제로 정적 메서드를 스터 빙하는 해결 방법을 제안하는 사람은 인스턴스 메서드를 만드는 것입니다. 가상이거나 인터페이스의 일부가 아닌 인스턴스 메서드에 대해서도 반대입니다.
그렇다면 왜 C #에 정적 메서드가 있습니까? 비가 상 인스턴스 메소드를 허용하는 이유는 무엇입니까?
이 "특징"중 하나를 사용하면 분리 된 메소드를 작성할 수 없습니다.
그래서 언제 사용합니까?
누군가가 스텁하기를 기대하지 않는 코드에 사용하십시오. 몇 가지 예 : String 클래스의 Format () 메소드 Console 클래스의 WriteLine () 메소드 Math 클래스의 Cosh () 메소드
그리고 한 가지 더. 대부분의 사람들은 이것에 신경 쓰지 않지만 간접 호출의 성능에 대해 할 수 있다면 인스턴스 메소드를 피하는 또 다른 이유입니다. 성능이 저하되는 경우가 있습니다. 이것이 비가 상 방법이 처음에 존재하는 이유입니다.