如何针对dotnet核心控制台应用程序运行验收测试?

时间:2019-07-17 17:17:14

标签: c# .net-core tdd xunit.net acceptance-testing

我正在尝试对dotnet核心控制台应用程序进行一些验收测试。我的测试连续失败,因为控制台应用程序未正确启动。通过正确启动,我的意思是我为运行控制台应用程序而产生的System.Diagnostics.Process并没有执行我想要的操作。

这是我设置场景的方式:

通过运行以下命令创建控制台应用程序:

dotnet new console -o myconsoleapp

然后修改Program.Main以通过-1返回Environment.Exit(-1)退出代码

通过运行以下命令创建测试项目:

dotnet new xunit -o myconsoleapp.tests

在测试项目中添加myconsoleapp作为参考:

dotnet add ./myconsoleapp.tests reference ./myconsoleapp

写验收测试:

[Fact]
public void AppExistsWithProperExitCode(){
  var @params = "myconsoleapp.dll";
  using(var sut = Process.Start("dotnet", @params))
  {
    sut.WaitForExit();
    var actual = sut.ExitCode;
    Assert.Equal(-1,actual);
  }
}

设置场景后,我运行测试:

dotnet test ./myconsoleapp.tests

运行测试始终会导致失败。为了诊断问题,我运行:

dotnet build ./myconsoleapp.tests
dotnet ./myconsoleapp.tests/bin/Debug/netcoreapp2.2/myconsoleapp.dll

运行这两个命令将返回以下错误消息:

A fatal error was encountered. The library 'hostpolicy.dll' required to execute the application was not found in 'myconsoleapp.tests/bin/Debug/netcoreapp2.2/'.
Failed to run as a self-contained app. If this should be a framework-dependent app, add the myconsoleapp.tests/bin/Debug\netcoreapp2.2/myconsoleapp.runtimeconfig.json file specifying the appropriate framework.

该错误消息很好地说明了所需的内容,但是我对dotnet核心并不了解,无法完成我的任务。

2 个答案:

答案 0 :(得分:0)

您可以使用dotnet publish -c Release -r win10-x64(对于Windows exe)创建自包含的可执行文件,然后将测试代码更改为

using(var sut = Process.Start(@"<path-to-the-executable>"))
{
  sut.WaitForExit();
  var actual = sut.ExitCode;
  Assert.Equal(-1,actual);
}

这可以在我的Windows 10 PC上使用dotnet core 3的预览版。

答案 1 :(得分:0)

我确定没有任何答案。这里的上下文是关键。我最终做了类似于@Fabio建议的操作,但是@Marius也有一个合理的答案。仅取决于您要测试的内容。

我想测试可执行文件是否相应运行。我相信我通过说这是验收测试来表达最初的问题是错误的,但这似乎更类似于功能测试。在测试中生成可运行的可执行文件的努力超出了我的期望。我改为测试Program.Main