Запуск интеграционных тестов NUnit с разными учетными данными - PullRequest
5 голосов
/ 19 мая 2011

Я выполняю интеграционные тесты с базой данных C #, NUnit и SQL Server 2008 r2 dev. Настройка моего прибора включает создание новой базы данных и загрузку тестовых данных, поэтому для этого мне нужны привилегии dbo.

Однако я хочу запускать сами тесты с меньшими привилегиями. У меня есть другая учетная запись AD, с которой я могу аутентифицироваться, и я могу запустить T-SQL, используя олицетворение, как описано здесь: http://support.microsoft.com/?scid=306158, следующим образом:

public static bool ExecuteFileAs(string fileName, string connectionString, 
                                  string user, string domain, string password)
{
    using(new Impersonator(user, domain, password))
    {
        using(var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            return SqlFileExecuter.RunSql(connection, fileName);
        }
    }
}

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

        impersonator = new Impersonator("username", "DOMAIN", "pwd");

Как только начинается первый модульный тест, я получаю эту ошибку, перечисляя одну из библиотек, использованных в этом тесте: System.IO.FileLoadException: Could not load file or assembly '...' or one of its dependencies. Access is denied. Я предоставил этой другой учетной записи полный доступ к каталогу со всеми моими двоичными файлами, что не помогло.

Любые предложения приветствуются.

Редактировать: моя рабочая станция все еще работает под управлением XP.

Ответы [ 2 ]

3 голосов
/ 20 мая 2011

Одним из возможных решений является не использовать проверку подлинности Windows, вместо этого используйте пользователя SQL.Это будет просто изменение строки подключения.

Кроме того, если ошибка связана с разрешениями ввода-вывода, вы можете попробовать выполнить все операции ввода-вывода, прежде чем выдавать себя за пользователя.Используя http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.server.aspx вместо SqlFileExecuter, вы можете напрямую выполнять блоки T-SQL для SQL Server (в отличие от ADO.NET).SMO немного отличается от того, как вы делаете это выше ...

var s = new Server(connectionString);
s.ConnectionContext.ExecuteNonQuery(@"CREATE DATABASE test; GO; Use test; ...");
2 голосов
/ 19 мая 2011

Попробуйте проверить, не блокирует ли что-либо еще тот же файл без общего доступа. Также включите регистрацию ошибок привязки. Введите fusion в стартовом меню win7 и запустите его от имени администратора, чтобы настройки не отображались серым цветом. Затем установите «Ошибка привязки журнала к диску» и укажите местоположение для файла журнала. Если вы не получаете никаких журналов, проверьте в реестре, что HKLM \ Software \ Microsoft \ Fusion \ ForceLog = 1

...