合同测试 DSL 错误行为/错误
Contract Testing DSL wrong behaviour / bug
我正在为我的 CorDapp 编写合同测试,但我卡在了某个点上,因为它没有正常运行。
这是合约代码(只显示相关部分)
when (command.value ) {
is LoanCommands.Issue -> requireThat {
"No Inputs should be consumed when issuing a Loan" using ( tx.inputs.isEmpty())
"Only a single output must be created when issugin a Loan" using (tx.outputs.size == 1)
"Outputs must not be empty" using (tx.outputs.isNotEmpty())
那这就是我的测试运行
@Test
fun issueTransactionMustHaveOneOutputOfTypeLoanContract() {
ledger {
transaction {
command(loanState.issuer.owningKey) { LoanContract.LoanCommands.Issue() }
timeWindow(ZonedDateTime.of(LocalDate.now(), time, zoneId).toInstant())
this `fails with` "Outputs must not be empty"
}
transaction {
command(loanState.issuer.owningKey) { LoanContract.LoanCommands.Issue() }
timeWindow(ZonedDateTime.of(LocalDate.now(), time, zoneId).toInstant())
output { loanState } // Two outputs fails.
output { dummyState}
this `fails with` "Only a single output must be created when issugin a Loan"
}
transaction {
command(loanState.issuer.owningKey) { LoanContract.LoanCommands.Issue() }
output { loanState } // One output passes.
timeWindow(ZonedDateTime.of(LocalDate.now(), time, zoneId).toInstant())
this.verifies()
}
}
}
请注意,第二个交易正确地失败了(当我删除第一个时),但第一个给我这个错误
2017-08-14 12:32:15,250 main WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
java.lang.AssertionError: Expected exception but didn't get one
at net.corda.testing.Verifies$DefaultImpls.failsWith(LedgerDSLInterpreter.kt:62)
at net.corda.testing.TransactionDSLInterpreter$DefaultImpls.failsWith(TransactionDSLInterpreter.kt)
at net.corda.testing.TestTransactionDSLInterpreter.failsWith(TestDSL.kt:89)
at net.corda.testing.Verifies$DefaultImpls.fails with(LedgerDSLInterpreter.kt:76)
at net.corda.testing.TransactionDSLInterpreter$DefaultImpls.fails with(TransactionDSLInterpreter.kt)
at net.corda.testing.TestTransactionDSLInterpreter.fails with(TestDSL.kt:89)
at net.corda.testing.TransactionDSL.fails with(TransactionDSLInterpreter.kt)
at com.template.contractTests.LoanContractIssueTest$issueTransactionMustHaveOneOutputOfTypeLoanContract.invoke(LoanContractIssueTest.kt:123)
at com.template.contractTests.
为什么不引发异常? tx.outputs.isNotEmpty()
似乎不起作用。
感谢任何帮助
问得好 - 从您的代码中我看不出问题所在。但是,请注意您的规则似乎重叠。您测试是否只有一个输出,然后测试是否有 >0 个输出。可以删除第二个测试,它永远不会捕捉到第一个没有捕捉到的任何东西。
问题是第一个测试中的交易不包含任何输入或输出。为了使交易有效,它必须被所有输入和输出的合约所接受。由于您没有输入或输出,因此交易始终有效。
当您有两个输出时,这不是问题,因为 verify
函数是 运行,因为在这种情况下存在两个输出。
我正在为我的 CorDapp 编写合同测试,但我卡在了某个点上,因为它没有正常运行。
这是合约代码(只显示相关部分)
when (command.value ) {
is LoanCommands.Issue -> requireThat {
"No Inputs should be consumed when issuing a Loan" using ( tx.inputs.isEmpty())
"Only a single output must be created when issugin a Loan" using (tx.outputs.size == 1)
"Outputs must not be empty" using (tx.outputs.isNotEmpty())
那这就是我的测试运行
@Test
fun issueTransactionMustHaveOneOutputOfTypeLoanContract() {
ledger {
transaction {
command(loanState.issuer.owningKey) { LoanContract.LoanCommands.Issue() }
timeWindow(ZonedDateTime.of(LocalDate.now(), time, zoneId).toInstant())
this `fails with` "Outputs must not be empty"
}
transaction {
command(loanState.issuer.owningKey) { LoanContract.LoanCommands.Issue() }
timeWindow(ZonedDateTime.of(LocalDate.now(), time, zoneId).toInstant())
output { loanState } // Two outputs fails.
output { dummyState}
this `fails with` "Only a single output must be created when issugin a Loan"
}
transaction {
command(loanState.issuer.owningKey) { LoanContract.LoanCommands.Issue() }
output { loanState } // One output passes.
timeWindow(ZonedDateTime.of(LocalDate.now(), time, zoneId).toInstant())
this.verifies()
}
}
}
请注意,第二个交易正确地失败了(当我删除第一个时),但第一个给我这个错误
2017-08-14 12:32:15,250 main WARN Unable to instantiate org.fusesource.jansi.WindowsAnsiOutputStream
java.lang.AssertionError: Expected exception but didn't get one
at net.corda.testing.Verifies$DefaultImpls.failsWith(LedgerDSLInterpreter.kt:62)
at net.corda.testing.TransactionDSLInterpreter$DefaultImpls.failsWith(TransactionDSLInterpreter.kt)
at net.corda.testing.TestTransactionDSLInterpreter.failsWith(TestDSL.kt:89)
at net.corda.testing.Verifies$DefaultImpls.fails with(LedgerDSLInterpreter.kt:76)
at net.corda.testing.TransactionDSLInterpreter$DefaultImpls.fails with(TransactionDSLInterpreter.kt)
at net.corda.testing.TestTransactionDSLInterpreter.fails with(TestDSL.kt:89)
at net.corda.testing.TransactionDSL.fails with(TransactionDSLInterpreter.kt)
at com.template.contractTests.LoanContractIssueTest$issueTransactionMustHaveOneOutputOfTypeLoanContract.invoke(LoanContractIssueTest.kt:123)
at com.template.contractTests.
为什么不引发异常? tx.outputs.isNotEmpty()
似乎不起作用。
感谢任何帮助
问得好 - 从您的代码中我看不出问题所在。但是,请注意您的规则似乎重叠。您测试是否只有一个输出,然后测试是否有 >0 个输出。可以删除第二个测试,它永远不会捕捉到第一个没有捕捉到的任何东西。
问题是第一个测试中的交易不包含任何输入或输出。为了使交易有效,它必须被所有输入和输出的合约所接受。由于您没有输入或输出,因此交易始终有效。
当您有两个输出时,这不是问题,因为 verify
函数是 运行,因为在这种情况下存在两个输出。