合同测试DSL错误的行为/错误

我正在为我的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$1$1.invoke(LoanContractIssueTest.kt:123) at com.template.contractTests. 

为什么它不提出例外? 它看起来像tx.outputs.isNotEmpty()不起作用。

任何帮助表示赞赏

问题是第一个测试中的交易不包含任何输入或输出。 要使交易有效,必须为所有投入和产出的合同所接受。 由于您没有输入或输出,交易总是有效的。

当您有两个输出时,这不是一个问题,因为verify功能在这种情况下由于两个输出的存在而运行。

好的问题 – 从你的代码我没有看到这个问题。 但是,请注意您的规则似乎重叠。 你测试的是只有一个输出,然后在那之后有> 0的输出。 第二个测试可以被删除,它永远不会捕捉到第一个测试没有的东西。