Запретить «тесту трюфеля» вызывать «развертывание (миграцию) трюфеля»

Кажется, что truffle testавтоматически вызывает truffle deploy(он же truffle migrate).

Насколько я понимаю, эти две функции совершенно не связаны.

Поэтому я не могу понять, почему трюфель работает таким образом.

Документы , кажется , ничего не упоминают по этому вопросу.

Я хотел бы использовать truffle testдля одного и truffle deployдля другого.

Есть ли способ «сказать» truffle test, чтобы избежать бега truffle deploy?

Спасибо!!!

В одном из ваших комментариев ниже вы, кажется, предполагаете, что решили эту проблему - не могли бы вы предоставить подробную информацию о том, как, пожалуйста?
@glowkeeper: это объясняется в том же комментарии.
не совсем - есть ли шанс, что вы могли бы поделиться какой-нибудь конфигурацией?
Ага, думаю, я разобрался с этим! В сценарии развертывания: ``` if ( network === 'rinkeby' ) { return } ``` Затем в тестовом сценарии: ``` this.contract = await BlahContract.at('0x48B98faB029Cd2c77afA780Ab94c2d4e2f4879dA'); ``` Затем запустите: truffle test --network rinkeby ```
@glowkeeper: я добавил это как ответ (поскольку это слишком долго для публикации в качестве комментария).

Ответы (5)

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

Но я хотел сохранить состояние между запусками трюфельного теста. Предлагаемый способ сделать это задокументирован как:

deployer.deploy (контракт, {перезаписать: ложь})

К сожалению, описанное выше не работает в truffle 5.0.1 из-за ошибки синтаксического анализа. Таким образом, обходной путь для принудительного правильного синтаксического анализа заключается в следующем:

deployer.deploy (контракт, {газ: 6720000, перезапись: ложь})

https://truffleframework.com/docs/truffle/testing/testing-your-contracts#clean-room-environment

Среда чистой комнаты

Truffle обеспечивает чистую среду при запуске тестовых файлов. При выполнении ваших тестов с Ganache или Truffle Develop Truffle будет использовать расширенные функции моментальных снимков, чтобы ваши тестовые файлы не делились состоянием друг с другом. При работе с другими клиентами Ethereum, такими как go-ethereum, Truffle повторно развертывает все ваши миграции в начале каждого тестового файла, чтобы убедиться, что у вас есть свежий набор контрактов для тестирования.

Хороший ответ, но было бы еще лучше, если бы вы связались с этой ошибкой синтаксического анализа, чтобы узнать, каков статус/обходные пути/и т. д.

Это действительно смущает, насколько узко мыслят авторы трюфелей. Мои тесты запускают собственное развертывание, которое используется в тестах. В моем случае миграция трюфелей включает в себя этапы копирования данных из старого экземпляра в новый экземпляр основного контракта, после чего старый контракт уничтожается. К сожалению, здесь снимок не помогает, старый экземпляр не восстанавливается и в json-файле контракта остается дефектный экземпляр. Поэтому я должен предотвратить запуск сценариев миграции. Итак, есть веские причины, по которым миграция должна быть необязательной и настраиваемой в truffle test!

Я решил это следующим образом:

  • запустите вторую canache-cliс отдельной сетью с именемtest
  • если truffle migrateскрипт в сети testничего не делать
  • запустить truffle testс опцией--network test

В деталях:

Добавьте в migrations/2_contractначало строки:

module.exports = async function(deployer, network, accounts) {
  if (network == "test") return; // test maintains own contracts
}

Добавить новую сеть testв truffle-config.js:


networks: {
  development: {
    host: "127.0.0.1",
    port: 8545,
    network_id: "*"
  },
  test: {
    host: "127.0.0.1",
    port: 8546,
    network_id: "*"
  }
}

Запустите второй canache-cli(помимо одной работающей сети development:

В одной консоли я запускаю ganache для developmentтестов графического интерфейса:

ganache-cli -d --db ${HOME}/tmp/ganache/development -i 123456 -p 8545

В другой консоли я запускаю отдельный ганаш для test:

ganache-cli -d --db ${HOME}/tmp/ganache/test -i 654321 -p 8546

Вот и все! Теперь я могу запустить:

truffle migrate --reset

И

truffle test --network test

Без помех.

Я думаю, несправедливо называть создателей трюфелей «недалекими».

Командная truffle testстрока использует developmentконфигурацию сети.

Другими словами, он фактически эквивалентен truffle test network=development.

Поэтому я решил эту проблему, добавив в каждый из сценариев миграции в моем проекте:

module.exports = function(deployer, network, accounts) {
    // encapsulate everything with this `if` statement
    if (network == "production") {
        ...
    }
};

Таким образом, все, что находится внутри ifоператора, при запуске не выполняется truffle test.

И чтобы сохранить возможность развертывания моих контрактов с Truffle, я добавил это в свой файл конфигурации Truffle ( truffle.jsили truffle-config.js):

    production: {
        host:       "localhost", // for example
        port:       7545,        // for example
        network_id: "*",         // for example
        gasPrice:   20000000000, // for example
        gas:        6721975      // for example
    }

Что позволяет мне развертывать мои контракты с помощью одной из следующих командных строк:

  • truffle deploy --network=production
  • truffle migrate --network=production

Прежде чем вы сможете запустить какой-либо тест, необходимо определить начальную точку, начальные условия в смарт-контракте. - Подумайте о значениях переменной в смарт-контрактах. Эти условия определяются процессом развертывания. Следовательно, обычно перед тестированием сначала запускают развертывание. Кроме того, это позволяет легко сбрасывать блокчейн после каждого отдельного теста.

Если вы не хотите этого делать, вы можете попробовать трюфельные скрипты . Они позволяют запускать любой скрипт или тест.

Спасибо. Нет, я хотел бы использовать, truffle testпотому что он обеспечивает хороший отчет. Я хотел бы сам создавать/развертывать контракты - разные контракты для каждого теста. И уж точно не одни и те же для каждого теста. В некоторых моих тестах я использую макеты контрактов с целью изолированного тестирования одного контракта (он же unitest ). В сценарии миграции, переданном truffle deploy, я хотел бы сделать «настоящую вещь», поскольку здесь я намерен не тестировать контракты, а фактически их развертывать.
Затем вы можете использовать флаги для развертывания: truffleframework.com/docs/advanced/configuration Если флаг не передан, вы просто не выполняете код развертывания. Затем тест трюфеля проходит без развертывания. Если вы передадите --network "testnetName", вы сможете выполнить развертывание в миграции.
Именно так я и решил это, кстати (выполнять только если network == "production"). Спасибо.
Хотя я бы не назвал их «флагами», в сценарий действительно передаются 3 параметра — deployer, networkи accounts.
У меня такое же требование — прежде чем я начну разрабатывать интерфейсный код для уже развернутых контрактов, я хочу запустить несколько тестов, чтобы убедиться, что они работают правильно! @josojo - не могли бы вы рассказать, как бы вы работали «без флагов», пожалуйста?
Этот ответ на самом деле не отвечает на вопрос, за исключением, возможно, объяснения логики разработчиков Truffle, что противоречит стандартной практике тестирования (заставляя настройку всегда оставаться одной и той же). Что забавно, так это то, что Truffle на самом деле не сбрасывает блокчейн после каждого теста.

Для тех, кто интересуется решением, вот тот, на который намекают в комментариях выше:

Во- первых, truffle-config.jsвыглядит примерно так:

module.exports = {
  networks: {
    rinkeby: {
      host: "localhost", // Connect to geth on the specified
      port: 8545,
      from: "0x8f03ca885434522d695735a28d6a8a93b4390da9", // default address to use for any transaction Truffle makes during migrations
      network_id: 4,
      gas: 4612388 // Gas limit used for deploys
    }
};

Затем в сценарии 2_deploy...:

if ( network === 'rinkeby' ) 
{ 
  return 
} 

Наконец, в вашем тестовом сценарии:

this.contract = await BlahContract.at('0x48B98faB029Cd2c77afA780Ab94c2d4e2f4879dA') 

Затем запустите:truffle test --network rinkeby

Очевидно, вам понадобится немного эфира Ринкеби, и вам нужно будет разблокировать учетную запись, с чем-то вроде personal.unlockAccount(eth.coinbase, "yourPassword", 3000);из консоли geth, но у меня этот метод работает для меня. Ура :)