您的位置 首页 编程知识

使用 STRETCHR/TESTIFY 和 MOCKERY 进行 GOL 测试

让我们看一个全面的示例,其中涵盖了stretchr/testify库的常见功能以及中的mockery。此示例将…

使用 STRETCHR/TESTIFY 和 MOCKERY 进行 GOL 测试

让我们看一个全面的示例,其中涵盖了stretchr/testify库的常见功能以及中的mockery。此示例将包括使用断言进行测试、使用 require 包进行严格断言、测试 http 处理程序以及使用 mockery 模拟依赖项。

设想

假设我们有一个从外部 api 获取用户信息的服务。我们想要测试:

  • 服务的功能。
  • 它与外部客户端的集成。
  • 嘲笑外部客户端。

项目结构

/project │ ├── main.go ├── service.go ├── service_test.go ├── user_client.go ├── mocks/ │   └── userclient.go (generated by mockery) └── go.mod  
登录后复制

代码概述

  1. user_client.go

    该文件定义了与外部用户 api 交互的接口。

    package project  type user struct {     id   int     name string }  type userclient interface {     getuserbyid(id int) (*user, error) } 
    登录后复制
  2. service.go

    该文件包含一个使用 userclient 获取用户详细信息的服务。

    package project  import "fmt"  type userservice struct {     client userclient }  func newuserservice(client userclient) *userservice {     return &userservice{client: client} }  func (s *userservice) getuserdetails(id int) (string, error) {     user, err := s.client.getuserbyid(id)     if err != nil {         return "", fmt.errorf("failed to get user: %w", err)     }      return fmt.sprintf("user: %s (id: %d)", user.name, user.id), nil } 
    登录后复制
  3. 使用嘲讽生成模拟

    您可以使用 mockery 为 userclient 生成模拟:

    mockery --name=userclient --output=./mocks 
    登录后复制

    这将在mocks/userclient.go 中生成一个模拟。

  4. service_test.go

    现在,让我们使用 testify 断言和模拟生成的模拟为 userservice 编写一个测试。

        package project_test      import (         "errors"         "testing"          "github.com/stretchr/testify/assert"         "github.com/stretchr/testify/require"         "github.com/stretchr/testify/mock"         "project"         "project/mocks"     )      func TestUserService_GetUserDetails_Success(t *testing.T) {         // Create a new mock client         mockClient := new(mocks.UserClient)          // Define what the mock should return when `GetUserByID` is called         mockClient.On("GetUserByID", 1).Return(&project.User{             ID:   1,             Name: "John Doe",         }, nil)          // Create the UserService with the mock client         service := project.NewUserService(mockClient)          // Test the GetUserDetails method         result, err := service.GetUserDetails(1)          // Use `require` for error checks         require.NoError(t, err)         require.NotEmpty(t, result)          // Use `assert` for value checks         assert.Equal(t, "User: John Doe (ID: 1)", result)          // Ensure that the `GetUserByID` method was called exactly once         mockClient.AssertExpectations(t)     }      func TestUserService_GetUserDetails_Error(t *testing.T) {         // Create a new mock client         mockClient := new(mocks.UserClient)          // Define what the mock should return when `GetUserByID` is called with an error         mockClient.On("GetUserByID", 2).Return(nil, errors.New("user not found"))          // Create the UserService with the mock client         service := project.NewUserService(mockClient)          // Test the GetUserDetails method         result, err := service.GetUserDetails(2)          // Use `require` for error checks         require.Error(t, err)         assert.Contains(t, err.Error(), "user not found")          // Ensure that the result is empty         assert.Empty(t, result)          // Ensure that the `GetUserByID` method was called exactly once         mockClient.AssertExpectations(t)     }  
    登录后复制

本例的要点

  1. 带有的断言证明:
    • assert 和 require 包用于不同类型的检查。
    • require 用于检查如果失败则应立即使测试失败(例如,检查 nil 错误)。
    • 断言用于即使失败也可以继续的检查(例如,比较值)。
  2. 嘲笑来嘲笑:
    • mockery 生成 userclient 接口的模拟。
    • 在测试中,模拟配置为使用 .on() 来指定预期输入,并使用 .return() 来指定输出。
    • assertexpectations 验证是否使用预期输入调用了模拟方法。
  3. 测试错误处理
    • 一个测试检查成功场景,而另一个测试则测试服务如何处理来自 userclient 的错误。

此设置涵盖了stretcher/testify 的断言和模拟的基本功能,为 golang 中的单元测试提供了结构化且可维护的方法。

以上就是使用 STRETCHR/TESTIFY 和 MOCKERY 进行 GOL 测试的详细内容,更多请关注php中文网其它相关文章!

本文来自网络,不代表四平甲倪网络网站制作专家立场,转载请注明出处:http://www.elephantgpt.cn/2804.html

作者: nijia

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

联系我们

联系我们

18844404989

在线咨询: QQ交谈

邮箱: 641522856@qq.com

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部