Тест интеграции ASP.Net Core React spa - PullRequest
0 голосов
/ 24 октября 2018

Интеграционное тестирование Asp.Net Core кажется довольно простым, но я не могу протестировать стартовое приложение с моим сервером реагирования.Он работает нормально из браузера, поэтому я предполагаю, что узел, npm и реакции настроены правильно, но не в xUnit.Сбой со следующим исключением:

System.AggregateException: произошла одна или несколько ошибок.---> System.AggregateException: произошла одна или несколько ошибок.---> System.InvalidOperationException: не удалось запустить 'npm'.Чтобы решить эту проблему:.

[1] Убедитесь, что 'npm' установлен и находится в одном из каталогов PATH.Текущая переменная среды PATH: {PATH}

Убедитесь, что исполняемый файл находится в одном из этих каталогов, или обновите свой PATH.

[2] Дополнительные сведения о причине см. В InnerException.---> System.ComponentModel.Win32Exception: имя каталога недействительно ...

Я предполагаю, что это потому, что он не может найти корень содержимого моего спа, поэтому я попытался добавить его в свой веб-хостингбез удачи:

.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 голосов
/ 27 апреля 2019

Уловка для меня заключалась в том, чтобы установить переменную среды разработки так, чтобы она указывала на каталог, в котором находится файл packages.json.

Ниже приведена выдержка из конструктора моего класса интеграционных тестов xUnit.

Обратите внимание, что сначала он определяет каталог решения (используя GetExecutingAssembly().Location), а затем указывает на папку проекта веб-источника.(В нашей среде Client.React - это каталог в каталоге решения, содержащий файл packages.json).

Затем каталог задается с помощью Directory.SetCurrentDirectory, после чего тестовый сервер настраивается с помощьюhthe UseWebRoot, снова указывающий на каталог, в котором находится файл packages.json.

Startup - это класс веб-запуска ASP.NET.

    /// <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();

    }
...