Mat*_*mas 8 c# integration-testing automated-tests .net-core
我在Visual Studio 2017中的.Net Core 1.1单元测试项目(不是xUnit测试项目)中有以下测试类.如何将命令行参数传递给TestMethod?
[TestClass]
public class TestClass
{
[TestMethod]
public void TestMethod()
{
var args = Environment.GetCommandLineArgs();
var json = JsonConvert.SerializeObject(args);
throw new Exception(json);
}
}
Run Code Online (Sandbox Code Playgroud)
互联网上的很多地方听起来好像你可以把--你想要传递的参数放在前面,但我无法让它发挥作用.
这些是我尝试过的命令:
dotnet test TestProject.csproj -- hello=worlddotnet test TestProject.csproj -- --hello worlddotnet test TestProject.csproj -- -hello world但是他们每次都输出这个消息.注意既不存在hello也不world存在:
[ "C:\用户\ ____ \的NuGet \包\ microsoft.testplatform.testhost\15.0.0\lib中\netstandard1.5\testhost.dll", " - 端口", "55032", " - parentprocessid" "24440"]
第一个字符串只是正在运行的程序集的名称 - 第一个命令行参数的标准.我不知道这些--port或--parentprocessid论据的来源.
此外,这些变化使得dotnet test扼流圈One or more runsettings provided contain invalid token(原文如此):
dotnet test TestProject.csproj -- -hello=worlddotnet test TestProject.csproj -- --hello=world编辑:它看起来GetCommandLineArgs() 不是一个伟大的选项,即使它确实在这里工作.
另外,2006年来自social.msdn.microsoft.com的这个问题的答案是:
实例化这些类的方式,以便VS可以对它们进行单元测试,这与正常执行完全不同.可执行文件不像普通的那样运行,你和VS都不能为它提供参数.通过将二进制文件用作类库,可以在程序执行的情况下实例化类.(原文如此)
我想知道这仍然适用于dotnet test?
在其他消息中,SO上的这个人怀疑命令行参数是否可以传递给DLL,但他错了:
[<entrypoint>函数的原型:] void CALLBACK EntryPoint(HWND hwnd,HINSTANCE hinst,LPSTR lpszCmdLine,int nCmdShow);
[Rundll]调用<entrypoint>函数,传递命令行tail,即<optional arguments>.
我想我对这一切的看法都是错误的。将以下两件事结合起来可能是最好的方法。
TestMethod现在是集成测试,而不是单元测试,因为它取决于命令行参数。
如果我重构,TestMethod以便它从这样的接口获取命令行参数:
interface IArgumentsProvider
{
IEnumerable<string> GetArguments();
}
Run Code Online (Sandbox Code Playgroud)
...然后这会转换TestMethod为单元测试,IArgumentsProvider可以在其中进行模拟,以便只有其中的功能TestMethod测试其中的功能(这就是单元测试的定义)。
请注意,我可能希望将该接口的非模拟实现上的测试移至其他集成测试所在的位置。见下文。
将测试重构为单元测试并不总是可能的。例如,在某些时候,您需要保证位置控制器在将代码发布到野外之前实际上可以从 SQL 数据库发布和检索地理坐标。
这是集成测试的一个示例。集成测试属于部署管道中的其他位置:不要将测试作为单元测试项目中构建定义的一部分执行,而是将其移至发布定义中并从更合适的框架中调用它。
| 归档时间: |
|
| 查看次数: |
3065 次 |
| 最近记录: |