Ответ 1
- Начать отладку Unit Test
- В первой строке вашего тестового кода или перед вызовом вашего локального веб-проекта api
- Щелкните правой кнопкой мыши на своем веб-проекте api и отлаживайте > Начать новый экземпляр
Есть ли способ 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.
Как заявил Дэниел Манн, это не модульное тестирование. Это интеграционное тестирование. Вы запускаете весь проект и проверяете все.
Если вы хотите использовать 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". выберите "несколько проектов запуска" и одновременно выберите проекты, которые вы хотите запустить.
Итак, коллега и я просто попробовали предлагаемые ответы безрезультатно. Тем не менее, мы действительно нашли решение для этого, которое хорошо работает, присоединяясь к процессу IIS, когда вы находитесь в режиме отладки в своем тесте. Вот шаги:
Для дополнительной простоты мы загрузили расширение для присоединения к IIS, которое автоматически предоставило нам меню в меню "Инструменты".
Для превосходной легкости мы настроили секцию панели инструментов, чтобы добавить команду меню на панель инструментов, чтобы прикрепить к IIS один простой щелчок.
Вы можете самостоятельно разместить веб-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 и выключения при очистке набора тестов.
Если у вас есть проект API и вы создали сквозной проект unit test для API (это означает, что вы тестируете API напрямую с помощью HttpClient, WebClient или других клиентских обертков http), вам нужно включить "Несколько проектов запуска" на решение. Выполните следующие шаги:
В текущей версии ASP.Net Core официальным решением является использование сборки Microsoft.AspNetCore.TestHost Nuget, которая создает имитируемый веб-сервер, на котором размещается веб-проект в тестовом проекте.
Подробности об использовании можно найти здесь: https://docs.microsoft.com/en-us/aspnet/core/testing/integration-testing
С одной стороны, это похоже на немного выдумки, потому что по какому определению это подлинное тестирование интеграции, если настоящий веб-сервер не задействован, с другой стороны, он, по крайней мере, работает довольно легко, как только вы его настроите.
Я пробовал хостинг selft, но у меня возникли некоторые проблемы 1.
HttpContext.Current is null
Решение 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
Затем выполните тест отладки, затем перейдите к пункту "Отладка"> "Присоединить к процессу"> в приложении, чтобы выбрать , нажмите "OK",
поиск iisexpress и нажмите кнопку присоединить