Asp.Net Core集成测试似乎非常简单,但是对于我来说,我无法使用我的react dev服务器测试入门应用程序。它可以从浏览器正常运行,因此我假设正确设置了node,npm和react,但未在xUnit下设置。它失败,但出现以下异常:
System.AggregateException:发生一个或多个错误。 ---> System.AggregateException:发生一个或多个错误。 ---> System.InvalidOperationException:无法启动'npm'。要解决此问题:。
[1]确保已安装“ npm”,并且可以在PATH目录之一中找到它。 当前的PATH环境变量为:{PATH}
确保可执行文件在这些目录之一中,或更新您的PATH。
[2]有关原因的更多详细信息,请参见InnerException。 ---> System.ComponentModel.Win32Exception:目录名称无效 ...
我认为这是因为找不到水疗中心的内容根,所以我尝试添加到我的Web主机构建器中没有运气:
.UseSolutionRelativeContentRoot( "Solution Relative Path to My App" ) );
这是我的测试课:
public class SampleDataControllerTest
{
private readonly TestServer server;
private readonly HttpClient client;
public SampleDataControllerTest()
{
server = new TestServer( WebHost.CreateDefaultBuilder()
.UseStartup<Startup>()
.UseSolutionRelativeContentRoot( "Solution Relative Path to My App" ) );
.UseEnvironment( "Development" );
client = server.CreateClient();
}
[Fact]
public async Task RootTest()
{
HttpResponseMessage page = await client.GetAsync( "/" );
Assert.NotNull( page );
Assert.Equal( HttpStatusCode.OK, page.StatusCode );
}
我想念什么?
答案 0 :(得分:0)
对我来说,技巧是将开发环境变量设置为指向packages.json
文件所在的目录。
下面是我的xUnit集成测试类的构造函数的摘录。
请注意,它首先确定解决方案目录(使用GetExecutingAssembly().Location
),然后指向Web源项目文件夹。 (在我们的环境中,Client.React
是解决方案目录下的包含packages.json
文件的目录。)
然后,使用Directory.SetCurrentDirectory
设置目录,然后通过UseWebRoot
设置测试服务器,再次指向packages.json
文件所在的目录。
Startup
是ASP.NET Web启动类。
/// <summary>
/// Constructor
/// </summary>
public IntegrationTest() : base()
{
var testAssemblyPath = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
// Remove the "\\bin\\Debug\\netcoreapp2.1"
var solutionPath = Directory.GetParent(testAssemblyPath.Substring(0, testAssemblyPath.LastIndexOf(@"\bin\", StringComparison.Ordinal))).FullName;
var clientReactPath = Path.Join(solutionPath, "Client.React");
// Important to ensure that npm loads and is pointing to correct directory
Directory.SetCurrentDirectory(clientReactPath);
var server = new TestServer(new WebHostBuilder()
.UseEnvironment("Development")
.UseWebRoot(clientReactPath)
.UseStartup<Startup>());
_client = server.CreateClient();
}