Home  >  Article  >  Backend Development  >  golang interface for testing

golang interface for testing

PHPz
PHPzforward
2024-02-09 09:57:15349browse

用于测试的 golang 接口

php editor Strawberry introduces you to a golang interface for testing. In the software development process, testing is an indispensable link, and this interface provides convenient testing functions. Through this interface, developers can quickly check the correctness and stability of the code and improve development efficiency. Whether it is functional testing, performance testing or stress testing of interfaces, this tool can meet your needs. In addition, the interface also provides a concise and intuitive display of test results, allowing developers to understand the running status of the code more intuitively. Whether you are a beginner or an experienced developer, this golang interface can bring convenience and benefits to your development work.

Question content

I am trying to create a database simulation in my code, then I introduce an interface to my code to create the simulation:

This is my code (I don't know if this is the correct way)

package interfaces

type objectapi interface {
    findsomethingindatabase(ctx context.context, name string) (e.response, error)
}

My interface implementation is:

package repositories

func findsomethingindatabase(ctx context.context, name string) (e.response, error) {

    statement, err := db.sqlstatementwithctx(ctx,
        `select * 
         from table
         where name = ? limit 1`)

    row := statement.queryrowcontext(ctx, name)

    if err != nil {
        return e.response{}, err
    }

    statement.close()
    return toresponse(row), nil  //this method convert row database to e.response struct

}

Now I need to call the implementation of findsomethingindatabase from a method and then I receive an object type interface:

func CallImplementation(request *dto.XRequest, repo i.ObjectAPI) dto.XResponse{
    result := repo.FindSomethingInDatabase(request.Ctx, request.Name)
// more code
}

But now I don't know how to call callimplementation` to pass the object with implementation.

Call the method that passes the interface implementation

Solution

Interface descriptionType. Since your findsomethingindatabase implementation is just a func with no receiver, there is no type that implements interface objectapi.

You can pass a value of type func(ctx context.context, name string) (e.response, error) as a callback into callimplementation and get rid of the interface completely . Alternatively, keep the interface, define the type, and make that type the receiver of the current findsomethingindatabase implementation. You can then pass that type to callimplementation as it will now implement the objectapi interface. An example of the latter (which would be my preferred option for scalability):

type database struct {}

func (d *database) FindSomethingInDatabase(ctx context.Context, name string) (e.Response, error) {
    // ...
}

func CallImplementation(request *dto.XRequest, repo i.ObjectAPI) dto.XResponse{
    result := repo.FindSomethingInDatabase(request.Ctx, request.Name)
// more code
}

func main() {
    db := &database{}
    _ = Callimplementation(getRequest(), db)
}

In this case, you might want to store db as a member of database rather than making it a global variable (which seems to be the case now).

The above is the detailed content of golang interface for testing. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete