문제

나는 다음과 같은 정적 속성을 통해 수업에서 액세스하는 싱글 톤이 있습니다.OtherClassNotBeingTested.Instance.SomeInstanceMethod()

이 개체 중 하나를 만들어서 수업을 테스트하고 싶습니다. 정적 속성의 getter가있을 때 Rhinomocks가 스텁을 반환 할 수있는 방법이 있습니까? Instance 호출 되나요?

명확하게 말하면 다음은 인스턴스 속성에 대한 코드입니다.

    /// <summary>
    /// Make a property to allow the OtherClassNotBeingTested class 
    ///   to be a singleton 
    /// </summary>
    public static OtherClassNotBeingTested Instance
    {
        get
        {
            // Check that the instance is null
            //  NOTE: COMMENTS BELOW HAVE SHOWN THIS TO BE BAD CODE.  DO NOT COPY
            if (mInstance == null)
            {
                // Lock the object
                lock (mSyncRoot)
                {
                    // Check to make sure its null
                    if (mInstance == null)
                    {
                        mInstance = new OtherClassNotBeingTested();
                    }
                }
            }

            // Return the non-null instance of Singleton
            return mInstance;
        }
    }

업데이트 : 이것이 내가 그것을 해결하는 방법입니다.

class ClassBeingTested
{
    public ClassBeingTested(IGuiInterface iGui):this(iGui, Control.Instance)
    {

    }

    public ClassBeingTested(IGuiInterface iGui, IControl control)
    {
        mControl = control;

        //Real Constructor here
    }
}

내 단위 테스트는 두 번째 생성자를 호출합니다. 실제 코드는 첫 번째 생성자를 호출합니다. 클래스의 코드는 로컬 필드를 사용합니다 McOntrol 싱글 톤 대신. (나는 이것을 종속성 주입이라고 생각합니다.)

나는 또한 싱글 톤을 당시 리팩토링했다 조랑말 토니제안.

도움이 되었습니까?

해결책

나는 당신의 mInstance 변수는 휘발성으로 선언됩니다. 그렇지 않으면 DCL 구현이 중단됩니다. 진지하게, 당신은 그 수준의 게으름이 필요합니까? 나는 개인적으로 일부를 추천합니다 더 간단한 패턴을 사용할 수 있습니다.

그러나 조롱에 관해서는 - 아니, 당신은 코뿔소로 정적 통화를 조롱 할 수 없습니다. 다음과 같이 사용할 수있는 몇 가지 도구가 있습니다. 타입 콕, 그러나 개인적으로 나는 앱을 처음부터 더 테스트 할 수 있도록 리팩터링합니다.

또 다른 옵션은 테스트 케이스에서 싱글 톤 속성의 가치를 설정할 수있는 "속임수"싱글 톤을 갖는 것입니다. 싱글 톤 클래스 대신에 속성을 반환하면 실제 싱글 톤을 모의로 교체 할 수 있습니다.

다른 팁

싱글 톤을 조롱 할 수있는 다른 소문에도 불구하고 : 내 대답을 참조하십시오.

정적 싱글 톤을 조롱하는 방법?

이 경우 정적 생성자가 없기 때문에 더 간단합니다. 싱글 톤이 이미 인터페이스를 구현하는 경우 생산 코드를 변경할 필요가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top