Как отлаживать /unit test webAPi в одном решении

Есть ли способ unit test или отладить веб-api в одном vs решении? Я потребляю WebAPI с помощью HttpClient и имею два экземпляра VS для этого.

в 1 экземпляре VS У меня есть unit test, во втором экземпляре vs у меня есть webapi, работающий в localhost.

Есть ли лучший способ сделать это?

Предпочтительным ли способом unit test является ссылка на проект WebAPI?

Я хочу использовать его с помощью httpClient и не ссылаться на него в проекте UnitTest.

поэтому в моем методе UnitTest у него будет baseAddress из http://localhost:1234"

здесь будет размещен WebAPI, если он запущен из одного и того же решения.

В текущем способе, который я отлаживаю, требуется запустить второй экземпляр Visual Studio с тем же загруженным решением и запустить проект WebAPI, а другой Visual Studio запускает проект unit test.

Ответ 1

  • Начать отладку Unit Test
  • В первой строке вашего тестового кода или перед вызовом вашего локального веб-проекта api
  • Щелкните правой кнопкой мыши на своем веб-проекте api и отлаживайте > Начать новый экземпляр

Ответ 2

Как заявил Дэниел Манн, это не модульное тестирование. Это интеграционное тестирование. Вы запускаете весь проект и проверяете все.

Если вы хотите использовать unit test ваши webapi-контроллеры, просто добавьте проект unit test в проект webapi и создайте модульные тесты. Вы хотите сосредоточиться на тестировании только одного класса за раз. Mock/Fake любые зависимости этого класса.

Вот хороший пример из Microsoft http://www.asp.net/web-api/overview/testing-and-debugging/unit-testing-with-aspnet-web-api

но если то, что вы ищете, запускает тест, который у вас есть в одном решении. Просто поставьте оба проекта в одно и то же решение. Щелкните правой кнопкой мыши по решению в проводнике решений. Выберите "Задать проекты StartUp". выберите "несколько проектов запуска" и одновременно выберите проекты, которые вы хотите запустить.

Ответ 3

Итак, коллега и я просто попробовали предлагаемые ответы безрезультатно. Тем не менее, мы действительно нашли решение для этого, которое хорошо работает, присоединяясь к процессу IIS, когда вы находитесь в режиме отладки в своем тесте. Вот шаги:

  • Обеспечьте, чтобы ваш проект по тестированию и проект Web API находились в одном и том же решении.
  • Убедитесь, что ваше решение настроено на один запуск в разделе свойств (т.е. оставить по умолчанию).
  • Добавить точку останова в конечную точку в методе контроллера, который вы хотите отлаживать.
  • Добавить контрольную точку в своем тесте, которую вы хотите отлаживать, а затем щелкнуть правой кнопкой мыши и нажать "Тесты отладки" (или использовать ваш любимый тестовый Runner, как ReSharper для отладки).
  • Как только ваша точка перехвата ударит, нажмите "Отладка" | Присоединитесь к процессу...
  • Найдите и нажмите на локальный процесс IIS для данной службы, затем нажмите "Прикрепить"
  • Продолжить отладку и посмотреть, как ваша точка останова в вашем сервисе попадает

Для дополнительной простоты мы загрузили расширение для присоединения к IIS, которое автоматически предоставило нам меню в меню "Инструменты".

Для превосходной легкости мы настроили секцию панели инструментов, чтобы добавить команду меню на панель инструментов, чтобы прикрепить к IIS один простой щелчок.

Ответ 4

Вы можете самостоятельно разместить веб-api, как упоминал майк,

var config = new HttpSelfHostConfiguration("http://localhost:8080");

config.Routes.MapHttpRoute(
    "API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional });

using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
    server.OpenAsync().Wait();
    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

для более подробной информации, http://www.asp.net/web-api/overview/older-versions/self-host-a-web-api

вы можете запустить хостинг при инициализации вашего пакета unit test и выключения при очистке набора тестов.

Ответ 5

Если у вас есть проект API и вы создали сквозной проект unit test для API (это означает, что вы тестируете API напрямую с помощью HttpClient, WebClient или других клиентских обертков http), вам нужно включить "Несколько проектов запуска" на решение. Выполните следующие шаги:

  • Щелкните правой кнопкой мыши файл решения и выберите свойства.
  • Выберите переключатель "Несколько запущенных проектов".
  • Выберите действие "Начало" в раскрывающемся списке для проекта веб-api и проекта unit test.
  • F5 для запуска в режиме отладки.
  • Появится диалоговое окно с сообщением "Проект с библиотекой классов выходного типа не может быть запущен напрямую". Это прекрасно, так как проект unit test - это просто библиотека классов (а не исполняемый файл, поэтому нет способа main/start). Просто нажмите "ОК".
  • В unit test, который вы хотите протестировать, щелкните правой кнопкой мыши и выберите "Debug Unit Tests", чтобы начать отладку.

Ответ 6

В текущей версии ASP.Net Core официальным решением является использование сборки Microsoft.AspNetCore.TestHost Nuget, которая создает имитируемый веб-сервер, на котором размещается веб-проект в тестовом проекте.

Подробности об использовании можно найти здесь: https://docs.microsoft.com/en-us/aspnet/core/testing/integration-testing

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

Ответ 7

Я пробовал хостинг selft, но у меня возникли некоторые проблемы 1.

HttpContext.Current is null
  1. У меня в веб-API пользовательский обработчик ошибок и в самостоятельно размещенных не работают

Решение IisExpress работает для меня очень хорошо

батовый файл для развертывания в iis

@Echo off 
set msBuildDir=C:\Program Files (x86)\MSBuild\14.0\Bin
::compile web api project
call "%msBuildDir%\msbuild.exe" solutionFilePath.sln /t:projectName /p:Configuration=Debug;TargetFrameworkVersion=v4.5 /l:FileLogger,Microsoft.Build.Engine;logfile=Manual_MSBuild_ReleaseVersion_LOG.log /p:Platform="Any CPU" /p:BuildProjectReferences=false

call "C:\Program Files (x86)\IIS Express\iisexpress.exe" /path:"pathToRootOfApiProject" /port:8888 /trace:error 

Я работаю с Nunit frameWork

  [SetUpFixture]
    public class SetUpTest
    {
        private Process process = null;
        private Process IisProcess = null;
        private System.IO.StreamWriter sw = null;
        string programsFilePath = Environment.GetEnvironmentVariable(@"PROGRAMFILES(X86)");

        [OneTimeSetUp]
        public void Initialize()
        {
            //compile web api project
            List<string> commands = new List<string>();
            commands.Add([email protected]"CD {programsFilePath}\MSBuild\14.0\Bin\");
            commands.Add([email protected]"msbuild ""pathToYourSolution.sln"" /t:ProjrctName /p:Configuration=Debug;TargetFrameworkVersion=v4.5 /p:Platform=""Any CPU"" /p:BuildProjectReferences=false /p:VSToolsPath=""{programsFilePath}\MSBuild\Microsoft\VisualStudio\v14.0""");
            RunCommands(commands);

            //deploy to iis express
            RunIis();
        }



        [OneTimeTearDown]
        public void OneTimeTearDown()
        {
            if (IisProcess.HasExited == false)
            {
                IisProcess.Kill();
            }
        }

        void RunCommands(List<string> cmds, string workingDirectory = "")
        {
            if (process == null)
            {
                InitializeCmd(workingDirectory);
                sw = process.StandardInput;
            }

            foreach (var cmd in cmds)
            {
                sw.WriteLine(cmd);
            }
        }

        void InitializeCmd(string workingDirectory = "")
        {
            process = new Process();
            var psi = new ProcessStartInfo();
            psi.FileName = "cmd.exe";
            psi.RedirectStandardInput = true;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;
            psi.UseShellExecute = false;
            psi.WorkingDirectory = workingDirectory;
            process.StartInfo = psi;
            process.Start();
            process.OutputDataReceived += (sender, e) => { Debug.WriteLine($"cmd output: {e.Data}"); };
            process.ErrorDataReceived += (sender, e) => { Debug.WriteLine($"cmd output: {e.Data}"); throw new Exception(e.Data); };
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
        }

        void RunIis()
        {
            string _port = System.Configuration.ConfigurationManager.AppSettings["requiredPort"];
            if (_port == 0)
            {
                throw new Exception("no value by config setting for 'requiredPort'");
            }

            IisProcess = new Process();
            var psi = new ProcessStartInfo();
            psi.FileName = [email protected]"{programsFilePath}\IIS Express\iisexpress.exe";
            psi.Arguments = [email protected]"/path:""pathToRootOfApiProject"" /port:{_port} /trace:error";
            psi.RedirectStandardInput = true;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;
            psi.UseShellExecute = false;
            IisProcess.StartInfo = psi;
            IisProcess.Start();
            IisProcess.OutputDataReceived += (sender, e) => { Debug.WriteLine($"cmd output: {e.Data}"); };
            IisProcess.ErrorDataReceived += (sender, e) =>
            {
                Debug.WriteLine($"cmd output: {e.Data}");
                if (e.Data != null)
                {
                    throw new Exception(e.Data);
                }
            };
            IisProcess.BeginOutputReadLine();
            IisProcess.BeginErrorReadLine();
        }
    }

прикрепить к iisexpress

Затем выполните тест отладки, затем перейдите к пункту "Отладка"> "Присоединить к процессу"> в приложении, чтобы выбрать enter image description here, нажмите "OK",

поиск iisexpress и нажмите кнопку присоединить