Тестовый класс, расширяющий тестовый класс в модуле зависимости

Если вы хотите версию на npm, array-move является ближайшим к этому ответу, хотя это не та же реализация. Дополнительную информацию см. В разделе использования. Предыдущая версия этого ответа (модифицированного Array.prototype.move) может быть найдена на npm в array.prototype.move .


У меня был довольно хороший успех с эта функция:

function array_move(arr, old_index, new_index) {
    if (new_index >= arr.length) {
        var k = new_index - arr.length + 1;
        while (k--) {
            arr.push(undefined);
        }
    }
    arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
    return arr; // for testing
};

// returns [2, 1, 3]
console.log(array_move([1, 2, 3], 0, 1)); 

Обратите внимание, что последний return просто предназначен для тестирования: splice выполняет операции над массивом на месте, поэтому возврат не требуется. В дополнение, этот move является операцией на месте. Если вы хотите избежать этого и вернуть копию, используйте slice .

Выполняя код:

  1. Если new_index больше длины массива, мы хотим (я полагаю) правильно разместить массив с новыми undefined s. Этот небольшой фрагмент обрабатывает это, нажимая undefined на массив до тех пор, пока мы не получим правильную длину.
  2. Затем в arr.splice(old_index, 1)[0] мы соединим старый элемент. splice возвращает элемент, который был сращирован, но находится в массиве. В нашем примере выше это было [1]. Итак, мы берем первый индекс этого массива, чтобы получить там исходный 1.
  3. Затем мы используем splice для вставки этого элемента в место new_index. Поскольку мы добавили массив выше, если new_index > arr.length, он, вероятно, появится в нужном месте, если только они не сделали что-то странное, как передать отрицательное число.

Более благоприятная версия для учета отрицательных индексов:

function array_move(arr, old_index, new_index) {
    while (old_index < 0) {
        old_index += arr.length;
    }
    while (new_index < 0) {
        new_index += arr.length;
    }
    if (new_index >= arr.length) {
        var k = new_index - arr.length + 1;
        while (k--) {
            arr.push(undefined);
        }
    }
    arr.splice(new_index, 0, arr.splice(old_index, 1)[0]);
    return arr; // for testing purposes
};
    
// returns [1, 3, 2]
console.log(array_move([1, 2, 3], -1, -2));

Что должно учитывать такие вещи, как array_move([1, 2, 3], -1, -2) правильно (переместите последний элемент во второе и последнее место). Результат для этого должен быть [1, 3, 2].

В любом случае, в вашем исходном вопросе вы сделаете array_move(arr, 0, 2) для a после c. Для d до b вы сделали бы array_move(arr, 3, 1).

24
задан Rich Seller 30 July 2009 в 20:42
поделиться

2 ответа

Обычно это решено путем создания и развертывания modulename-test.jar файлов в дополнение к регулярному modulename.jar файлу. Вы развертываете их на repos как регулярные артефакты. Это не полностью безупречно, но работает прилично на артефакты кода.

Тогда Вы добавили бы, что тест определил объем зависимостей к тестовым банкам к другим модулям.

можно также решить, это путем помещения теста определило объем артефактов в "основном" объеме в отдельном собственном модуле, и затем включайте это в регулярный тестовый объем в других модулях. Это решение не работает очень хорошо в сборке мультимодуля, куда каждый модуль экспортирует некоторые тестовые артефакты, так как Вы в основном получаете модули на 2 Н.

Многие из нас на самом деле разочаровываются в обоих из них решение, когда мы понимаем, что количество классов справедливо ограничено и существуют проблемы, связанные с обоими из них решение. Мы просто помещаем их в соответственно именованный пакет в "основном" объеме. Я просто продолжаю забывать, почему двумя первыми решениями является боль.

5
ответ дан krosenvold 28 November 2019 в 23:23
поделиться

Вы можете развернуть тестовый код в качестве дополнительного артефакта, используя цель test-jar maven-jar-plugin . Он будет прикреплен к проекту и развернут вместе с тестами классификатора.

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <executions>
      <execution>
        <phase>package</phase>
        <goals>
          <goal>test-jar</goal>
        </goals>
      </execution>
    </executions>
  </plugin>

Другие проекты могут затем ссылаться на тестовый контейнер, объявив классификатор тестов в зависимости.

<dependency>
  <groupId>name.seller.rich</groupId>
  <artifactId>foo</artifactId>
  <version>1.0.0</version>
  <classifier>tests</classifier>
  <scope>test</scope>
</dependency>
32
ответ дан 28 November 2019 в 23:23
поделиться