我有一个单身人士,可以通过这样的静态属性在我的班级中访问:OtherClassNotBeingTested.Instance.SomeInstanceMethod()

我想通过制作这些对象之一来测试我的班级。有没有办法让犀牛在静态属性的GETTER时返回存根 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实现被损坏。说真的,您真的需要那种懒惰的水平吗?我个人推荐一些 可用的简单模式.

但是,当涉及到嘲笑时 - 不,您不能用犀牛嘲笑静态通话。有一些可用的工具,例如 打字机, ,但就我个人而言,我会重新制作该应用程序,首先要进行更高的测试。

另一个选项是拥有一个“作弊”单例,您可以在测试案例中设置单身属性的值。如果将属性返回接口而不是单身顿类本身,则可以用模拟替换真实的Singleton。

其他提示

尽管有谣言,您还可以嘲笑单身人士,请查看我的答案:

如何嘲笑一个静态的单例?

在这种情况下,它甚至更简单,因为没有静态构造函数。如果您的Singleton已经实现了接口,则无需更改您的生产代码。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top