代码之家  ›  专栏  ›  技术社区  ›  Ramachandran.A.G

TDD-在R3中运行契约测试的断言错误

  •  1
  • Ramachandran.A.G  · 技术社区  · 6 年前

    在Corda的契约测试(来自Git repo for:IOUIssueTests)中,mustIncludeIssueCommand()的测试需要异常,但不会抛出异常。

       public void mustIncludeIssueCommand() {
            IOUState iou = new IOUState(Currencies.POUNDS(1), ALICE.getParty(), BOB.getParty());
    
            ledger(ledgerServices, l -> {
                l.transaction(tx -> {
                    tx.output(IOUContract.IOU_CONTRACT_ID, iou);
                    tx.command(Arrays.asList(ALICE.getPublicKey(), BOB.getPublicKey()), new Commands.DummyCommand()); // Wrong type.
                    return tx.failsWith("Contract verification failed");
                });
                l.transaction(tx -> {
                    tx.output(IOUContract.IOU_CONTRACT_ID, iou);
                    tx.command(Arrays.asList(ALICE.getPublicKey(), BOB.getPublicKey()), new IOUContract.Commands.Issue()); // Correct type.
                    return tx.verifies();
                });
                return null;
            });
        }
    

    失败的原因是

    java.lang.AssertionError: Expected exception but didn't get one
    
        at net.corda.testing.dsl.Verifies$DefaultImpls.failsWith(LedgerDSLInterpreter.kt:66)
        at net.corda.testing.dsl.TransactionDSLInterpreter$DefaultImpls.failsWith(TransactionDSLInterpreter.kt)
        at net.corda.testing.dsl.TestTransactionDSLInterpreter.failsWith(TestDSL.kt:67)
        at net.corda.testing.dsl.TransactionDSL.failsWith(TransactionDSLInterpreter.kt)
    

    我试着在解决方案回购中运行代码,但似乎也失败了。我有什么遗漏吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Austin Moothart    6 年前

    Corda training应用程序背后的目的之一是显示预期的失败,在这种情况下,您可以看到单元测试预期事务失败: return tx.failsWith("Contract verification failed");

    在单元测试的前面,我们可以看到测试失败的原因: new Commands.DummyCommand() 这不是有效的命令,并且 IOUContract 应使事务失败,因为它与 Issue 命令。

    切换到 契约 类必须有一行检查事务中包含的命令。这样做的方法是 tx.commands.requireSingleCommand . 确保您传递了正确的命令以进行require,并且您应该能够通过流测试的这一步。

    出于教育原因,我在这里避免给出完整的答案,但您可以在培训解决方案库中查看答案。