我写了以下的两段链码
// 查看竞赛信息是否存在
func (cc *SmartContract) ContestExists(ctx contractapi.TransactionContextInterface,
id string) (bool, error) {
contestJson, err := ctx.GetStub().GetState("contest" + id)
if err != nil {
return false, fmt.Errorf("failed to read from the world state: %v", err)
}
fmt.Println("json:", contestJson != nil) // 此处是一个测试点
return contestJson != nil, nil
}
// 创建竞赛信息
func (cc *SmartContract) CreateContest(ctx contractapi.TransactionContextInterface,
id, name, desc string) error {
exists, err := cc.ContestExists(ctx, id)
if err != nil {
return err
}
if exists {
return fmt.Errorf("the contest %s already exists.\n", id)
}
contest := &Contest{
EducateId: id,
Contest: name,
Description: desc,
}
contestJson, err := json.Marshal(contest)
if err != nil {
return fmt.Errorf(">> contest MARSHAL error: %v", err)
}
err = ctx.GetStub().PutState("contest" + contest.EducateId, contestJson)
if err != nil {
return fmt.Errorf(">> contest PUT error: %v", err)
}
return nil
}
然后以下是我所写的单元测试代码
func TestSmartContract_CreateContest(t *testing.T) {
chaincodeStub := &mocks.ChaincodeStub{}
transactionContext := &mocks.TransactionContext{}
transactionContext.GetStubReturns(chaincodeStub)
contestCreator := &SmartContract{}
err := contestCreator.CreateContest(transactionContext,
"", "", "")
require.NoError(t, err)
chaincodeStub.GetStateReturns([]byte{}, nil)
err = contestCreator.CreateContest(transactionContext,
"4", "", "")
//require.NoError(t, err)
require.EqualError(t, err, "the contest 4 already exists.\n")
chaincodeStub.GetStateReturns(nil, fmt.Errorf("unable to retrieve contest"))
err = contestCreator.CreateContest(transactionContext,
"4", "", "")
require.EqualError(t, err, "failed to read from the world state: unable to retrieve contest")
}
然而运行测试时,测试点先后出现了截然不同的结果
json: false
json: true
下断点调试后发现是在调用下面这一句时由false转为了true
err = contestCreator.CreateContest(transactionContext,
"4", "", "")
但目前依然不太清楚这究竟是什么原因,应该怎么解决这个问题呢?