How to debug/unit test webAPi in one solution

前端 未结 7 1848
借酒劲吻你
借酒劲吻你 2021-02-12 22:17

Is there a way to unit test or debug a web api in one vs solution? I am consuming the WebAPI using HttpClient and have two instances of VS up to do this.

in 1 VS instan

7条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-02-12 22:37

    I try the selft hosted but I get some problens 1.

    HttpContext.Current is null
    
    1. I have in the web api custom error handler and in self hosted don't work

    IisExpress solution work for me very good

    bathe file to deploy to 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 
    

    I work with 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 commands = new List();
                commands.Add($@"CD {programsFilePath}\MSBuild\14.0\Bin\");
                commands.Add($@"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 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 = $@"{programsFilePath}\IIS Express\iisexpress.exe";
                psi.Arguments = $@"/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();
            }
        }
    

    attach to iisexpress

    Debug test then make a breakpoint goto Debug>Attach to process> in the attach to select click OK,

    search iisexpress and click attach

提交回复
热议问题