Проблемы GitLab-CI с file_get_contents во время тестов PHPUnit

У меня довольно простая проблема, которую я не могу понять.

Я разрабатываю PHP-приложение на основе ООП, используя Composer Dependency Manager, PHPUnit для тестирования. Я размещаю репозиторий на GitLab и использую GitLab-CI для запуска тестов PHPUnit.

Мой каталог файлов довольно прост:

├──_data
├──_2016
├──_federal
├──fit.json
├──_libs
├──_paycheckCalculator
├──paycheck.php
├──taxCalc.php
├──_public_html
├──index.php
├──_vendor
├──[composer dependencies]
├──autoload.php
├──_tests
├──paycheckTest.php
├──taxCalcTest.php
├──_templates
├──[Twig templates]

taxCalc.php содержит:

public static function calcFIT($taxableWages, array $taxStatus, int $frequency = 52):float {
$fitFile = "../data/2016/federal/fit.json";
...

Это отлично работает на моем производственном сервере, и я могу нормально запускать тесты PHPunit через интеграцию PHPUnit с PhpStorm, но когда я пытаюсь заставить работать GitLab-CI, я постоянно получаю сообщение об ошибке:


$ vendor / bin / phpunit —configuration phpunit.xml PHPUnit 5.5.4 от
Себастьян Бергман и соавторы.

EE..EII 7
/ 7 (100%)

Время: 32 мс, память: 4,00 МБ

Было 3 ошибки:

1) paycheckTest :: calcNetTest
file_get_contents (../ data / 2016 / федеральный / fit.json): не удалось открыть
поток: нет такого файла или каталога

/builds/calebrw/paycheckCalculator/libs/paycheckCalculator/taxCalc.php:100
/builds/calebrw/paycheckCalculator/libs/paycheckCalculator/paycheck.php:49
/builds/calebrw/paycheckCalculator/libs/paycheckCalculator/paycheck.php:28
/builds/calebrw/paycheckCalculator/tests/paycheckTest.php:34

2) paycheckTest :: calcTaxesTest
file_get_contents (../ data / 2016 / федеральный / fit.json): не удалось открыть
поток: нет такого файла или каталога

/builds/calebrw/paycheckCalculator/libs/paycheckCalculator/taxCalc.php:100
/builds/calebrw/paycheckCalculator/tests/paycheckTest.php:58

3) taxCalcTest :: calcFITTest
file_get_contents (../ data / 2016 / федеральный / fit.json): не удалось открыть
поток: нет такого файла или каталога

/builds/calebrw/paycheckCalculator/libs/paycheckCalculator/taxCalc.php:100
/builds/calebrw/paycheckCalculator/tests/taxCalcTest.php:53

ОШИБКИ! Тесты: 7, Утверждения: 11, Ошибки: 3, Неполные: 2. ОШИБКА:
Сборка не удалась: код выхода 1

мой .gitlab_ci.yml как следует:

# Select image from https://hub.docker.com/_/php/
image: php:7.0

# Select what we should cache
cache:
paths:
- vendor/

before_script:
# Install git, the php image doesn't have installed
- apt-get update -yqq
- apt-get install git -yqq

# Install composer
- curl -sS https://getcomposer.org/installer | php

# Install all project dependencies
- php composer.phar install

PHPUnit:testsuite:
script:
- vendor/bin/phpunit --configuration phpunit.xml

мой phpunit.xml файл содержит:

<?xml version="1.0" encoding="UTF-8"?>
<phpunit
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:noNamespaceSchemaLocation="http://schema.phpunit.de/4.5/phpunit.xsd"colors="false"convertErrorsToExceptions="true"convertNoticesToExceptions="true"convertWarningsToExceptions="true"stopOnFailure="false">

<testsuites>
<testsuite name="Paycheck Tests">
<directory>tests/</directory>
</testsuite>
</testsuites>
<php>
<includePath>/builds/calebrw/paycheckCalculator</includePath>
</php>
</phpunit>

Обратите внимание, что я использовал это с или без <includePath> тег и нет разницы, если я использую <includePath>/../</includePath> или что-нибудь еще по этому вопросу.

Я ценю любую помощь, которую вы можете оказать.

РЕДАКТИРОВАТЬ:

Я наконец получил это, чтобы работать. Я добавил функцию (пока что в глобальном пространстве) config.php файл:

/**
* Required Functions
*/

function getDirectory(bool $html = false):string
{
$htmlBaseDirectory = '/webprojects/paycheckCalculator';

if ($html == true) {
return $htmlBaseDirectory;
} else {
return dirname(__DIR__);
}
}

Это означало, что я мог бы обновить свой index.php:

require_once('config.php'); // Configuration Variables
require_once( getDirectory() . '/vendor/autoload.php'); // Composer Autoload
$dir = getDirectory(true) . $htmlPublicDirectory; // Combined variable needed for Twig compatibility

но у меня все еще были проблемы с бегуном GitLab-Ci, который имел совершенно другую среду, которая вообще не вызывает мой config.php, поэтому я добавил исправление (или действительно хак), чтобы тест проходил к taxCalc.php :

if (getenv('CI_BUILD_ID') !== false) {
define('MAIN_PATH', '/builds/calebrw/paycheckCalculator/');
} else {
define('MAIN_PATH', dirname(__DIR__));
}

...
class taxCalc
{
...
public static function calcFIT($taxableWages, array $taxStatus, int $frequency = 52):float {
$fitFile = MAIN_PATH . "/data/2016/federal/fit.json";

И сейчас сборка проходит.

Спасибо за помощь обоим людям, которые ответили.

1

Решение

Убедитесь, что файл зафиксирован (обычно вы не фиксируете данные, вы можете поместить его в ресурсы). Я думаю, что вы уже сделали.

Второе — это просто предложение:
определить константу PATH и использовать это. Потому что в вашем случае вы никогда не знаете, где находится ваш текущий рабочий каталог.

Определите файл начальной загрузки в phpunit и определите MAIN_PATH, Пример:

<?php

define('MAIN_PATH', dirname(__DIR__));

require MAIN_PATH . '/vendor/autoload.php';

В индексе вы также должны указать этот MAIN_PATH, а в calcFit вы напишите:

<?php

function calcFit() {
$fitFile = MAIN_PATH . '/data/2016/federal/fit.json';
}
2

Другие решения

Весьма вероятно, что вы используете относительный путь в вашем требовании. Смотрите здесь для объяснений и решений: PHP — Не удалось открыть поток: нет такого файла или каталога

0

По вопросам рекламы [email protected]