Использование Microsoft Moles со статическими переменными - PullRequest
0 голосов
/ 07 октября 2011

У меня следующий код

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;
        }
    }

В этом коде я хочу смоделировать поведение метода GetString SampleClass. Но когда я пишу родинки для этого, код выдает исключение, сообщая, что произошла ошибка при статической инициализации. Я не могу получить проблему здесь. Сообщение об ошибке:

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)

Мое сомнение в том, что если я смоделировал метод, то почему он собирается создать базу данных? Кто-нибудь может сказать мне, в чем здесь проблема? Спасибо Ashwani

1 Ответ

0 голосов
/ 31 октября 2011

Среда Moles не поддерживает обходной код, который вызывается статическим конструктором. Метод GetString(string) вызывается статическим конструктором класса SampleClass. Поскольку обход не поддерживается, GetString ведет себя так, как не смоделирован. Таким образом, ваша фабрика БД называется.

Начиная с версии v0.92.50603.1 есть атрибут, который позволяет вам «стирать» вызовы статического конструктора.

Из руководства кротов:

Статические конструкторы обрабатываются специально с родинками. Это возможно указать, что статический конструктор данного типа должен быть просто стереть. Это делается через Атрибут [MolesEraseStaticConstructor] выглядит следующим образом:

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