Значения даты и времени модульного тестирования

У меня есть функция, которая использует текущее время ( now). Контракт в целом является краудфандинговым токеном, и стоимость токенов различается в зависимости от даты и времени их приобретения.

Как имитировать разное время при тестировании смарт-контракта? Например, что касается приведенного ниже кода, я хотел бы провести модульное тестирование, чтобы выяснить, верен ли код для установки цены, но я не могу изменить значение now.

Было бы хорошим решением просто заменить nowключевое слово на другую временную переменную тестирования, скажем, now_simа затем вручную изменить now_simво время моделирования?

    if (now < (startTime + 1 days)) {
        currentPrice = safeDiv(safeMul(price, 80), 100);  // 20 % discount (x * 80 / 100)
    } 
    else if (now < (startTime + 2 days)) {
        currentPrice = safeDiv(safeMul(price, 90), 100);  // 10 % discount (x * 90 / 100)
    }
    else if (now < (startTime + 12 days)) {
        // 1 % reduction in the discounted rate from day 2 until day 12 (sliding scale per second)
        // 8640000 is 60 x 60 x 24 x 100 (100 for 1%) (60 x 60 x 24 for seconds per day)
        currentPrice = price - safeDiv(safeMul((startTime + 12 days) - now), price), 8640000);
    }
    else {
        currentPrice = price;
    }
Есть способ увеличить время с помощью testrpc. Может поможет в этом случае. Проверьте evm_increaseTime: github.com/ethereumjs/testrpc
@RobHitchens ДА: для стандартного модульного тестирования на основе Javascript в Truffle evm_increaseTimeбыло бы лучшим вариантом для имитации разных времен.
@RobHitchens, я искал всю документацию testrpc и truffle, но я не могу понять, как использовать evm_increaseTimeконсоль truffle. Не могли бы вы помочь??
Не использовал его раньше. Похоже, что более общий вопрос здесь заключается в том, как получить доступ к любому из перечисленных там методов TestRPC из контекста трюфеля. Не кажется очевидным.

Ответы (2)

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

В договоре nowесть block.timeStamp.

Эта временная метка на практике является приблизительной , с отклонением до пятнадцати минут.

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

В подобных ситуациях у меня был тест, ожидающий добытого блока с отметкой времени, прошедшей время, которое я жду. Я вижу, как это будет проблемой, если вам придется ждать 12 дней.

Было бы неплохо разбить и параметризовать вехи, чтобы вы могли тестировать с меньшими интервалами, чтобы все это могло пройти все тесты за минуту или две. Возможно, неудовлетворительно для «финального» теста, но достаточно для начальных тестов.

Надеюсь, это поможет.

Если вы используете pyethereum для тестирования — что я настоятельно рекомендую, это прекрасно — вы можете напрямую изменить метку времени смоделированного блока, который обрабатывает вашу транзакцию.

self.s = t.state()
self.s.block.timestamp = self.s.block.timestamp + 86400
self.s.mine(1)
some_val = your_contract.do_something(some_parameter)
self.assertEqual(some_val, whatever)

См. рабочий пример здесь (возможно, немного устаревший): https://github.com/realitykeys/subjectivocracy/blob/master/contracts/test.py#L85 .

Truffle лучше всего работает с testrpc. Я попытался настроить pyethereum в Windows и просто сдался через день или около того. Я также мог найти любую документацию о коде солидности, совместим ли он только со змеем?