В настоящее время я пишу приложение, которое записывает в регистр QLDB. У меня есть функция вроде:
// Use an interface that matches the QLDB Driver so we can inject / mock
type ILedgerDriver interface {
Execute(ctx context.Context, fn func(txn qldbdriver.Transaction) (interface{}, error)) (interface{}, error)
Shutdown(ctx context.Context)
}
// Create checks for a records existence before inserting on to the ledger.
func Create(driver ILedgerDriver, document interface{}) (interface{}, error) {
return ls.Driver.Execute(context.Background(), func(txn qldbdriver.Transaction) (interface{}, error) {
result, err := txn.Execute("SELECT * FROM People WHERE ID = ?", id)
if err != nil {
return nil, errors.Wrap(err, "error selecting document")
}
// Check if there are any results
if result.Next(txn) {
// document exists
return nil, nil
}
result, err = txn.Execute("INSERT INTO People ?", document)
if err != nil {
return nil, errors.Wrap(err, "error inserting document")
}
return result, nil
})
}
Затем я пытаюсь издеваться над чем-то вроде этого:
// implements qldbdriver.Transaction.
type mockQldbTx struct{}
func (mockQldbTx) Execute(statement string, parameters ...interface{}) (*qldbdriver.Result, error) {
for _, p := range parameters {
if ps, _ := p.(string); ps == "ERROR" {
return nil, errors.New("execute failed")
}
if ps, _ := p.(string); ps == "WILLFINDME" {
emptyResult := &qldbdriver.Result{}
return emptyResult, nil
}
}
return nil, nil
}
func (mockQldbTx) BufferResult(result *qldbdriver.Result) (*qldbdriver.BufferedResult, error) {
return nil, nil
}
func (mockQldbTx) Abort() error {
return nil
}
// implements ILedgerDriver
type mockDriver struct{}
func (mockDriver) Execute(ctx context.Context, fn func(txn qldbdriver.Transaction) (interface{}, error)) (interface{}, error) {
mockTx1 := mockQldbTx{}
result, err := fn(mockTx1)
return result, err
}
func (mockDriver) Shutdown(ctx context.Context) {
}
Что, в основном, работает. Однако, поскольку qldbdriver.Result
не является интерфейсом, кажется, я не могу имитировать транзакцию, чтобы проверить случай, когда результат будет иметь свойства index
и pageValues
(которые вызовут блок if result.Next(txn)
).
Кто-нибудь сталкивался с этим или может указать на какие-либо руководства? Или я просто слишком осторожен, и мне не нужно проверять, работает ли моя функция создания? (и любая другая более крупная бизнес-логика, помимо этой, будет находиться в другой функции, которую можно протестировать изолированно?)