0

我有以下函数,它采用类型切片SchoolDbEntry并将其批量插入数据库。

type SchoolRegistry struct {
    Conn         *sqlx.DB
}

insertStudentEntry = `insert into StudentEntries (registerId, studentId, fee, admissionDate) values (:registerId, :studentId, :fee, :admissionDate)`

func (s *SchoolRegistry) AddStudentEntries(ctx context.Context, entry []StudentDbEntry) error {
    requestHeaders := helper.FetchHeaders(ctx)

    query, args, err := sqlx.Named(insertStudentEntry, entry)
    if err != nil {
        return exception.DBInternalError
    }

    _, err = s.Conn.Exec(query, args...)
    if err != nil {
        return cutomModels.NewError(err.Error()
    }

    return nil
}

我正在尝试使用以下函数使用 sqlmock 对此进行测试

var repo *SchoolRegistry


func TestAddStudentEntriesSuccess(t *testing.T) {

     db, mock, err := sqlmock.New()
     if err != nil {
            t.Fatalf("an error '%s' was not expected when opening a stub database connection", err)
     }

     sqlxDb := sqlx.NewDb(db, "sqlmock")

     defer sqlxDb.Close()

     repo = &SchoolRegistry{sqlxDb}
     if err := logger.Init(logLevel, logTimeFormat); err != nil {
         fmt.Printf("failed to initialize logger: %v", err)
     }

    query := `insert into StudentEntries (registerId, studentId, fee, admissionDate) values (:registerId, :studentId, :fee, :admissionDate)`

    args := []models.StudentDbEntry{
        {
            RegisterID:     1,
            StudentID:      1,
            Fee:            "100",
            AdmissionDate:  "10-20-2015",
        },
    }

    prep := mock.ExpectPrepare(query)
    prep.ExpectExec().WithArgs(1,1,"100","10-20-2015").WillReturnResult(sqlmock.NewResult(0, 0))

    err := repo.AddStudentEntries(helper.FetchTestContext(), args)
    assert.NoError(t, err)

}

但是,测试失败了。我正进入(状态

call to ExecQuery 'insert into StudentEntries (registerId, studentId, fee, admissionDate) values (?, ?, ?, ?)' with args [{Name: Ordinal:1 Value:1} {Name: Ordinal:2 Value:1} {Name: Ordinal:3 Value:"100"} {Name: Ordinal:4 Value:"10-20-2015"}], was not expected, next expectation is: ExpectedPrepare => expecting Prepare statement which:
                              - matches sql: 'insert into StudentEntries (registerId, studentId, fee, admissionDate) values (:registerId, :studentId, :fee, :admissionDate)' 

预期没有错误时的错误(即,在此行之后:)_, err = s.Conn.Exec(query, args...)。当我将它作为实际代码的一部分进行测试时,该函数运行良好。问题只是单元测试。

4

0 回答 0