Кажется, что truffle test
автоматически вызывает truffle deploy
(он же truffle migrate
).
Насколько я понимаю, эти две функции совершенно не связаны.
Поэтому я не могу понять, почему трюфель работает таким образом.
Документы , кажется , ничего не упоминают по этому вопросу.
Я хотел бы использовать truffle test
для одного и truffle deploy
для другого.
Есть ли способ «сказать» truffle test
, чтобы избежать бега truffle deploy
?
Спасибо!!!
Я тоже столкнулся с этой проблемой, и это действительно предполагаемое поведение трюфельного теста: поведение в чистой комнате. Каждый запуск трюфельного теста повторно развертывает контракты. В противном случае сохраненное состояние предыдущего запуска может повлиять на результаты последующего запуска, что сделает набор тестов недетерминированным.
Но я хотел сохранить состояние между запусками трюфельного теста. Предлагаемый способ сделать это задокументирован как:
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
, я хотел бы сделать «настоящую вещь», поскольку здесь я намерен не тестировать контракты, а фактически их развертывать.network == "production"
). Спасибо.deployer
, network
и accounts
.Для тех, кто интересуется решением, вот тот, на который намекают в комментариях выше:
Во- первых, 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, но у меня этот метод работает для меня. Ура :)
светлячок
хорошая вибрация
светлячок
светлячок
хорошая вибрация