0

次のコードがあります

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)

ここでの私の疑問は、メソッドをモール化した場合、なぜデータベースの作成に行くのでしょうか? ここで何が問題なのか誰か教えてもらえますか? ありがとうアシュワニ

4

1 に答える 1

0

Moles フレームワークは、静的コンストラクターによって呼び出される迂回コードをサポートしていません。メソッドGetString(string)は、クラスの静的コンストラクターによって呼び出されますSampleClass。迂回はサポートGetStringされていないため、モールディングされていないため動作しません。したがって、db ファクトリが呼び出されます。

バージョン v0.92.50603.1 以降、静的コンストラクター呼び出しを「消去」できる属性があります。

ほくろのマニュアルから:

静的コンストラクターは Moles で特別に扱われます。特定の型の静的コンストラクターを単純に消去するように指定することができます。これは、次のように [MolesEraseStaticConstructor] 属性を介して行われます。

[assembly: MolesEraseStaticConstructor(typeof(MyStatic))]
class MyStatic {
    static MyStatic() {
        throw new Exception(); // needs moling…
    }
} 
于 2011-10-31T14:49:50.510 に答える