Использование строки подключения в тесте nunit - PullRequest
3 голосов
/ 02 июля 2010

мы используем приложение nunit.exe для запуска нашего (интеграционного) теста

Теперь у меня проблема с тем, что строка подключения не берется из app.config из библиотеки DLL, в которой находится тестовый код.

Это звучит логично, потому что nunit.exe является стартовым приложением, а не тестовой dll (кстати, он работал, когда я запускал тесты с Visual Studio testframework), но я должен поместить строки соединений в nunit. exe.config

Я попытался установить их в тест-коде (работает для настроек приложения: ConfigurationManager.AppSettings.Set("DownloadDirectory", mDir);) вот так: ConfigurationManager.ConnectionStrings.Add(conset); (где conset - это ConnectionStringSettings объект), но затем я получаю сообщение об ошибке, что раздел строки подключения доступен только для чтения.

Что я должен сделать, чтобы использовать строки подключения в моем тесте?

EDIT: мы используем структуру сущностей, поэтому мы не можем поместить строку подключения в набор настроек приложения, потому что она читает из раздела напрямую, я не смог найти способ обойти это поведение.

Ответы [ 4 ]

6 голосов
/ 02 июля 2010

Используя отражение, вы можете (в памяти) изменить свое значение Configuration.ConnectionStrings [connectionName], что в вашем случае вы, вероятно, сделали бы в SetUp или, возможно, TestFixtureSetUp. Смотри http://david.gardiner.net.au/2008/09/programmatically-setting.html.

// Back up the existing connection string
ConnectionStringSettings connStringSettings = ConfigurationManager.ConnectionStrings[connectionName];
string oldConnectionString = connStringSettings.ConnectionString;

// Override the IsReadOnly method on the ConnectionStringsSection.
// This is something of a hack, but will work as long as Microsoft doesn't change the
// internals of the ConfigurationElement class.
FieldInfo fi = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(connStringSettings, false);

// Set the new connection string value
connStringSettings.ConnectionString = connectionStringNeededForNUnitTest;
2 голосов
/ 24 сентября 2013

Я понимаю, что это не тот ответ, который вы ищете, но именно тот, который я применил для решения той же проблемы:

Вы можете изменить, по крайней мере, в EF5 и EF4.3, вашу реализацию DbContextи добавьте конструктор, который принимает жестко закодированную строку соединения, такую ​​как эта:

    public partial class MyContext : DbContext
    {
        public MyContext() : base("name=MyContext")
        {
        }
        // --- Here is the new thing:
        public MyContext(string entityConnectionString) : base(entityConnectionString)
        {
        }
        // --- New thing ends here

        // .... the rest of the dbcontext implementation follows below 
    } 

Вам придется вставлять эту вещь каждый раз, когда вы обновляете свой контекст, но ИМХО это стоит хлопот.Строка соединения должна быть структурой сущности, отформатированной с вашими метаданными и всем, но вы сможете это выяснить.Просто держите его где-нибудь, чтобы вы могли вставить его при необходимости.

1 голос
/ 02 июля 2010

Вы можете прочитать значение строки подключения из ConfigurationManager.AppSettings, да, оно доступно только для чтения.Вы можете изменить это в App.Config.Если вы хотите изменить некоторые значения в строке подключения, например, в URL-адресе, в коде, вы можете изменить свой dataContext.URL или любые свойства, которые вы хотите использовать при кодировании.

0 голосов
/ 02 июля 2010

Я думаю, что для юнит-тестов это может быть намного проще. Вы можете поместить строку подключения в тестовый класс непосредственно как жестко закодированную строку. в простых модульных тестах вы тестируете ограниченную логическую область и не заботитесь о достоверности входных аргументов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...