ASP.Net Core React spa集成测试

时间:2018-10-24 02:37:43

标签: reactjs asp.net-core integration-testing single-page-application xunit

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 );
    }

我想念什么?

1 个答案:

答案 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();

    }