Проблема с модульным тестированием проекта ASP.NET (NullReferenceException при запуске теста) - PullRequest
2 голосов
/ 25 мая 2010

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

"Ссылка на объект не установлена ​​на экземпляр объекта "

То, что я пытаюсь сделать, - это тестирование уровня доступа к данным, где я использую класс контекста данных LINQ для выполнения определенной функции и возврата результата, однако в процессе отладки я обнаружил, что все тесты завершаются неудачно, как только они попадают в класс контекста данных LINQ, и это как-то связано со строкой соединения, но я не могу понять, в чем проблема.

Сбой отладки тестов здесь (вторая строка):

public EICDataClassesDataContext() :
    base(global::System.Configuration.ConfigurationManager.ConnectionStrings["EICDatabaseConnectionString"].ConnectionString, mappingSource)
    {
        OnCreated();
    }

И мой тест выглядит следующим образом:

TestMethod()]
    public void OnGetCustomerIDTest()
    {
        FrontLineStaffDataAccess target = new FrontLineStaffDataAccess(); // TODO: Initialize to an appropriate value
        string regNo = "jonh"; // TODO: Initialize to an appropriate value
        int expected = 10; // TODO: Initialize to an appropriate value
        int actual;
        actual = target.OnGetCustomerID(regNo);
        Assert.AreEqual(expected, actual);
    }

Метод, который я вызываю из DAL:

 public int OnGetCustomerID(string regNo)
    {
        using (LINQDataAccess.EICDataClassesDataContext dataContext = new LINQDataAccess.EICDataClassesDataContext())
        {
            IEnumerable<LINQDataAccess.GetCustomerIDResult> sProcCustomerIDResult = dataContext.GetCustomerID(regNo);
            int customerID = sProcCustomerIDResult.First().CustomerID;

            return customerID;
        }
    }

Таким образом, в основном все происходит сбой после того, как он достигает 1-й строки метода уровня DA и когда он пытается создать экземпляр класса доступа к данным LINQ ...

Я потратил около 10 часов, пытаясь устранить проблему, но безрезультатно ... Я был бы очень признателен за любую помощь!

UPDATE: Наконец я исправил это !!!! :) Я не знаю почему, но по некоторым причинам в файле app.config соединение с моей базой данных было следующим:

AttachDbFilename = | DataDirectory | \ EICDatabase.MDF

Итак, я просто изменил путь и вместо | DataDirectory | Я положил фактический путь, где мой файл MDF сидит, т.е.

C: \ Users \ 1 \ Documents \ Visual Studio 2008 \ Projects \ EICWebSystem \ EICWebSystem \ App_Data \ EICDatabase.mdf

После того, как я это сделал, все получилось! Но все же немного неясно, в чем проблема ... возможно, неправильный путь к базе данных? Мой web.config проекта ASP.NET содержит | DataDirectory | \ EICDatabase. Путь МДФ, хотя ..

Ответы [ 3 ]

2 голосов
/ 25 мая 2010

LINQDataAccess.EICDataClassesDataContext ищет web.config или какой-либо другой внешний источник данных для его настройки?

Я могу с уверенностью сказать, что вы должны прыгнуть через обруч, чтобы получить web.config доступный для вашего тестового кода.

Обновление О да. Я вижу, что вы используете ConfigurationManager в строке, где ваш тест не пройден ... ConfigurationManager ищет web.config для конфигурации. Это стало камнем преткновения для меня, когда я пишу свои тесты.

Вам нужно либо изменить код, чтобы создать экземпляр класса без web.config, либо сделать так, чтобы ваши тесты могли обращаться к web.config.

2 голосов
/ 25 мая 2010

Есть ли у вашего тестового проекта собственный файл конфигурации? Этот тип поведения обычно означает, что приложение не может найти строку подключения. Тестовые проекты требуют собственного файла, поскольку они не работают в контексте клиентского приложения.

ОБНОВЛЕНИЕ Ошибка, которую вы описываете после добавления app.config, часто встречается при тестировании веб-приложений, созданных на SQLExpress, и присоединении .mdf. SQLExpress не может быть запущен более чем в одном процессе одновременно. Так что, если вы ранее запустили ваше веб-приложение, оно все еще может быть активным и конфликтовать с попыткой присоединить базу данных.

Вы можете использовать SQL Management Studio для постоянного подключения к базе данных, а затем использовать более традиционную строку подключения, такую ​​как:

Server=myServer;Database=EICDatabase;Trusted_Connection=True;
0 голосов
/ 25 мая 2010

Для меня кажется, что ваша проблема в строке подключения, которая не установлена.Я предполагаю, что ваш юнит-тест находится в другом проекте, чем DAL.Вы вызываете команду «new» в конструкторе datacontext без строки подключения.Поэтому он должен обычно использовать его по умолчанию, когда установлено.Но так как этот параметр обычно хранится в web.config другого проекта, строка подключения не установлена, и вы получаете ошибку.

Если это правильно, то, как я полагаю, вы должны получить настройки изПроект DAL в проект модульного тестирования.Простейшим решением должно быть копирование строки подключения web.config в app.config проекта модульного тестирования.

Конечно, есть и другие возможности, но я думаю, что нелегко получить конфигурацию web.config в свой модуль.тестовый проект.

...