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

Kotlin 合同测试DSL错误行为/错误,kotlin,corda,Kotlin,Corda,我正在为我的CorDapp编写一个契约测试,但我被困在了某个点上,因为它没有按应有的方式运行 这是合同代码(仅提供相关部分) 这就是我正在进行的测试 @Test fun issueTransactionMustHaveOneOutputOfTypeLoanContract() { ledger { transaction { command(loanState.issuer.owningKey) { LoanContract.LoanCo

我正在为我的CorDapp编写一个契约测试,但我被困在了某个点上,因为它没有按应有的方式运行

这是合同代码(仅提供相关部分)

这就是我正在进行的测试

    @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()
不工作


感谢您的帮助

问得好-从您的代码中我看不出问题所在。但是,请注意,您的规则似乎重叠。测试是否只有一个输出,然后测试是否有>0个输出。第二个测试可以删除,它永远不会捕获第一个测试没有的任何内容。

好问题-从您的代码中,我看不出问题所在。但是,请注意,您的规则似乎重叠。测试是否只有一个输出,然后测试是否有>0个输出。第二个测试可以删除,它永远不会捕获第一个测试没有的任何内容。

问题是第一个测试中的事务不包含任何输入或输出。为了使交易有效,它必须被所有输入和输出的合同所接受。由于没有输入或输出,因此事务始终有效


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

问题在于第一个测试中的事务不包含任何输入或输出。为了使交易有效,它必须被所有输入和输出的合同所接受。由于没有输入或输出,因此事务始终有效



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

是的,我知道,最初只有前两个输出。我添加了第三个,错误地希望它会改变一些东西,但是以不同的顺序编写输入、输出、命令、时间窗口等有什么区别吗?也许有一个优先顺序,比如输入->发出命令->输出->时间戳?是的,我知道,最初只有前两个。我添加了第三个,错误地希望它会改变一些东西,但是以不同的顺序编写输入、输出、命令、时间窗口等有什么区别吗?可能有一个首选顺序,如输入->发出命令->输出->时间戳?您应该单独测试每个事务,这里有一个示例:我会尝试,但正如我在这里读到的,您可以在测试中链接事务,如果不是使用稍微复杂的契约,您将在测试中编写太多冗余的codechain事务,这将改变状态。好的,我将尝试,但问题是在第一个事务中,我的代码应该改变什么?仅使用该事务创建一个新的空函数,我想不会有太大变化,但现在让我看看尝试过了,仅为该事务创建一个新的空测试仍然会得到相同的错误您应该单独测试每个事务,这里有一个示例:我将尝试,但正如我在这里读到的,您可以在测试中链接事务,如果不是使用稍微复杂的契约,您将在测试中编写太多冗余的codechain事务,这将改变状态。好的,我将尝试,但问题是在第一个事务中,我的代码应该改变什么?仅使用该事务创建一个新的空函数,我想不会有太大的变化,但是现在让我看看,仅为该事务创建一个新的空测试仍然会得到相同的错误OK,假设它没有意义去测试一个没有输入和输出的事务,对吗?是的-我无法想象它在什么情况下会有用。好吧,假设它没有意义去测试一个没有输入和输出的事务,对吗?是的-我无法想象它在什么情况下会有用。
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.