Как основное объектное/функциональное объединение в цепочку работает в JavaScript?

Я предполагаю, что calculateExecutionStartTime возвращает время, которое составляет два часа назад по сравнению со временем, когда вы вызываете метод, и это то, что вы хотите проверить. В своем первом предложении я также предполагаю, что вы можете изменить метод, чтобы он возвращал современный Instant вместо устаревшего Date. Поскольку вы можете использовать java.time, современный Java-интерфейс даты и времени, это сразу выглядело бы как простое улучшение.

Проблема в том, что вызов может занять несколько миллисекунд, даже несколько секунд, и мы не знаем, в какой момент времени во время вызова он читает часы. Таким образом, нет тестирования с использованием assertEquals с ожидаемым временем. Вместо этого мы читаем часы до и после вызова. Тогда наш тест может полагаться на метод, считывающий часы в некоторый момент между нашими двумя вызовами. В большинстве случаев это позволит нам проверить возвращаемое время с небольшим запасом. Идея была уже представлена ​​Даудом ибн Каримом в комментарии.

@Test
public void testCalculateExecutionStartTime() {
    Instant timeBefore = Instant.now();
    Instant executionStartTime = proxy.calculateExecutionStartTime(
            properties.getMessageConfiguration().getExecutionStartTime());
    Instant timeAfter = Instant.now();

    Duration expectedTimeAgo = Duration.ofHours(2);
    Assert.assertFalse(executionStartTime.isBefore(timeBefore.minus(expectedTimeAgo)));
    Assert.assertFalse(executionStartTime.isAfter(timeAfter.minus(expectedTimeAgo)));
}

Обратите внимание на использование Instant.now() для чтения часов. Вам не нужно ZonedDateTime и ZoneOffset.

Если вы не можете изменить тип возвращаемого значения calculateExecutionStartTime, просто конвертируйте полученное из него Date:

    Instant executionStartTime = proxy.calculateExecutionStartTime(
                    properties.getMessageConfiguration().getExecutionStartTime())
            .toInstant();

Все остальное точно так же, как и раньше.

26
задан Bergi 6 July 2019 в 11:08
поделиться

2 ответа

В функциях JavaScript являются объектами первого класса. Когда вы определяете функцию, она является конструктором для этого функционального объекта. Другими словами:

var gmap = function() {
    this.add = function() {
        alert('add');
    return this;
    }

    this.del = function() {
       alert('delete');
       return this;
    }

    if (this instanceof gmap) {
        return this.gmap;
    } else {
        return new gmap();
    }
}
var test = new gmap();
test.add().del();

Назначив

new gmap();
переменной test, вы создали новый объект, который «наследует» все свойства и методы конструктора (класса) gmap (). Если вы запустите приведенный выше фрагмент, вы увидите предупреждение для «добавить» и «удалить».

В приведенных выше примерах «this» относится к объекту окна, если только вы не заключите функции в другую функцию или объект.

Поначалу мне трудно понять цепочку, по крайней мере, для меня, но как только я понял это, я понял, насколько мощным это может быть инструмент.

38
ответ дан 28 November 2019 в 07:29
поделиться

К сожалению, прямой ответ должен быть «нет». Даже если вы можете переопределить существующие методы (что вы, вероятно, можете во многих UA, но я подозреваю, что в IE это невозможно), вы все равно застряли бы с неприятными переименованиями:

HTMLElement.prototype.setAttribute = function(attr) { 
    HTMLElement.prototype.setAttribute(attr) //uh-oh;  
}

Лучшее, что вы могли бы получить подальше использует другое имя:

HTMLElement.prototype.setAttr = function(attr) {
    HTMLElement.prototype.setAttribute(attr);
    return this;
}
4
ответ дан 28 November 2019 в 07:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: