【问题标题】:Using Microsoft Moles with static variables使用带有静态变量的 Microsoft Moles
【发布时间】:2011-10-07 09:02:44
【问题描述】:

我有以下代码

public class SampleClass
    {
        static string sampleString = GetString("sample");

        public static string GetString(string p)
        {
            return DatabaseInteraction.GetData(p);
        }
    }

    public static class DatabaseInteraction
    {
        public static string GetData(string p)
        {
            ///In actual implementation it is call to database
            return string.Empty;
        }
    }

在这段代码中,我想模拟 SampleClass 的 GetString 方法的行为。但是,当我为此编写痣时,代码会抛出异常,说明静态初始化中发生了一些错误。 我无法在这里解决问题。 错误信息:

System.TypeInitializationException: The type initializer for 'MDatabaseInteraction
.GetString' threw an exception. ---> System.Configuration.ConfigurationErrorsException: The requested database dbPortalOracle is not defined in configuration.

StackTrace:
           at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseConfigurationView.ValidateConnectionStringSettings(String name, ConnectionStringSettings connectionStringSettings)
            at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseConfigurationView.GetConnectionStringSettings(String name)
            at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseCustomFactory.CreateObject(IBuilderContext context, String name, IConfigurationSource configurationSource, ConfigurationReflectionCache reflectionCache)
            at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.ConfiguredObjectStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id)
            at Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
            at Microsoft.Practices.ObjectBuilder.SingletonStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
            at Microsoft.Practices.ObjectBuilder.BuilderStrategy.BuildUp(IBuilderContext context, Type typeToBuild, Object existing, String idToBuild)
            at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.ConfigurationNameMappingStrategy.BuildUp(IBuilderContext context, Type t, Object existing, String id)
            at Microsoft.Practices.ObjectBuilder.BuilderBase`1.DoBuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies)
            at Microsoft.Practices.ObjectBuilder.BuilderBase`1.BuildUp(IReadWriteLocator locator, Type typeToBuild, String idToBuild, Object existing, PolicyList[] transientPolicies)
            at Microsoft.Practices.ObjectBuilder.BuilderBase`1.BuildUp[TTypeToBuild](IReadWriteLocator locator, String idToBuild, Object existing, PolicyList[] transientPolicies)
            at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.EnterpriseLibraryFactory.BuildUp[T](IReadWriteLocator locator, String id, IConfigurationSource configurationSource)
            at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.EnterpriseLibraryFactory.BuildUp[T](String id, IConfigurationSource configurationSource)
            at Microsoft.Practices.EnterpriseLibrary.Common.Configuration.ObjectBuilder.NameTypeFactoryBase`1.Create(String name)
            at Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase(String name)

我的疑问是,如果我篡改了该方法,那么为什么要创建数据库? 谁能告诉我这里有什么问题? 谢谢 阿什瓦尼

【问题讨论】:

  • 我确定异常实际上并不仅仅是说“静态初始化中发生了一些错误”-我怀疑它有完整的堆栈跟踪,包括嵌套异常...请发布确切的异常.
  • 好吧,看起来您在某个地方有一个引用“dbPortalOracle”的配置,但您没有提供有关其他地方的详细信息。如果不了解您的配置,很难了解更多信息。看看 MDatabaseInteraction 的类型初始化器实际上做了什么......

标签: .net unit-testing moles pex-and-moles


【解决方案1】:

moles 框架不支持由静态构造函数调用的迂回代码。方法GetString(string) 由类SampleClass 的静态构造函数调用。由于不支持绕行,GetString 的行为就像它没有被篡改一样。因此,您的数据库工厂被调用。

从 v0.92.50603.1 版本开始,有一个属性可以让您“擦除”静态构造函数调用。

来自摩尔手册:

静态构造函数使用 Moles 进行特殊处理。有可能的 指定给定类型的静态构造函数应该是 简单地被抹去。这是通过 [MolesEraseStaticConstructor] 属性如下:

[assembly: MolesEraseStaticConstructor(typeof(MyStatic))]
class MyStatic {
    static MyStatic() {
        throw new Exception(); // needs moling…
    }
} 

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2016-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多