当前位置: 首页 > news >正文

网站开发工资高嘛十大外贸电商平台

网站开发工资高嘛,十大外贸电商平台,南昌 网站,有网站后台模板如何做数据库GoMock是一个Go框架。它与内置的测试包整合得很好,并在单元测试时提供了灵活性。正如我们所知,对具有外部资源(数据库、网络和文件)或依赖关系的代码进行单元测试总是很麻烦。 安装 为了使用GoMock,我们需要安装gomo…

GoMock是一个Go框架。它与内置的测试包整合得很好,并在单元测试时提供了灵活性。正如我们所知,对具有外部资源(数据库、网络和文件)或依赖关系的代码进行单元测试总是很麻烦。

安装

为了使用GoMock,我们需要安装gomock包github.com/golang/mock/gomock和mockgen代码生成工具github.com/golang/mock/mockgen。使用这个命令行:

go get github.com/golang/mock/gomock
go get github.com/golang/mock/mockgen

GoMock的使用遵循四个基本步骤:

  • 使用mockgen为你想模拟的接口生成一个模拟对象。
  • 在测试部分,创建一个gomock.Controller的实例,并把它传递给你的mock对象的构造函数以获得一个mock对象。
  • 在mock上调用EXPECT()来设置期望值和返回值。
  • 在模拟控制器上调用Finish()来断言模拟对象的期望。

开始

让我们创建一个这样的文件夹(本代码在 go1.16.15 版本下执行)

gomock_test
├── doer
│ └── doer.go
├── mocks
│ └── mock_doer.go
└── user├── user.go└── user_test.go

doer/doer.go

package doertype Doer interface {DoSomething(int, string) errorSaySomething(string) string
}

那么这里是我们在模拟Doer接口时要测试的代码。

user/user.go

package userimport "gomock_test/doer"const (filtered   = "OK"unfiltered = "spam"Nice       = "nice"Bad        = "bad"
)type User struct {// struct while mocking the doer interfaceDoer doer.Doer
}// method Use using it
func (u *User) Use() error {return u.Doer.DoSomething(123, "Hello GoMock")
}func (u *User) SaySomething(num int) string {if num == 3 {return u.Doer.SaySomething(unfiltered)}return u.Doer.SaySomething(filtered)
}type Student struct{}func (s *Student) DoSomething(_ int, _ string) error {panic("not implemented") // TODO: Implement
}func (s *Student) SaySomething(kata string) string {if kata == filtered {return Nice}return Bad
}

我们将把Doer的模拟放在一个包mocks中。我们首先创建一个包含我们的模拟实现的目录mocks,然后在doer包上运行mockgen:

mockgen -destination=../mocks/mock_doer.go -package=mocks gomock_test/doer Doer

NOTE: 在执行这步的时候,会报错:Failed to format generated source code: mocks/mock_doer.go:5:15: expected ‘;’, found '.’ 这个时候,我们只需要将打印出来的代码复制到我们对应的文件中即可。

当有大量的接口/包需要模拟时,为每个包和接口运行mockgen是一种乌托邦。为了缓解这个问题,可以将mockgen命令与go:generate放在一起。

go:generate mockgen -destination=../mocks/mock_doer.go -package=mocks gomock_test/doer Doer

我们必须自己创建目录模拟,因为GoMock不会为我们这样做,而是会以错误退出。

  • destination=…/mocks/mock_doer.go : 把生成的mocks放在这个路径下。
  • -package=mocks : 把生成的mocks放在这个包里
  • gomock_test/doer : 为这个包生成mocks。
  • Doer : 为这个接口生成mocks(必填),因为我们需要指定哪个接口来生成mocks。(如果需要的话,可以用逗号分隔的列表来指定多个接口。例如,Doer1, Doer2)

因为我们对mockgen的调用在我们的项目中放置了一个文件mocks/mock_doer.go。这就是这样一个生成的mock实现的样子:

// Code generated by MockGen. DO NOT EDIT.
// Source: github.com/timliudream/go-test/gomock_test/doer (interfaces: Doer)// Package github.com/timliudream/go-test/gomock_test/mocks is a generated GoMock package.
package mocksimport (gomock "github.com/golang/mock/gomock"reflect "reflect"
)// MockDoer is a mock of Doer interface.
type MockDoer struct {ctrl     *gomock.Controllerrecorder *MockDoerMockRecorder
}// MockDoerMockRecorder is the mock recorder for MockDoer.
type MockDoerMockRecorder struct {mock *MockDoer
}// NewMockDoer creates a new mock instance.
func NewMockDoer(ctrl *gomock.Controller) *MockDoer {mock := &MockDoer{ctrl: ctrl}mock.recorder = &MockDoerMockRecorder{mock}return mock
}// EXPECT returns an object that allows the caller to indicate expected use.
func (m *MockDoer) EXPECT() *MockDoerMockRecorder {return m.recorder
}// DoSomething mocks base method.
func (m *MockDoer) DoSomething(arg0 int, arg1 string) error {m.ctrl.T.Helper()ret := m.ctrl.Call(m, "DoSomething", arg0, arg1)ret0, _ := ret[0].(error)return ret0
}// DoSomething indicates an expected call of DoSomething.
func (mr *MockDoerMockRecorder) DoSomething(arg0, arg1 interface{}) *gomock.Call {mr.mock.ctrl.T.Helper()return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "DoSomething", reflect.TypeOf((*MockDoer)(nil).DoSomething), arg0, arg1)
}// SaySomething mocks base method.
func (m *MockDoer) SaySomething(arg0 string) string {m.ctrl.T.Helper()ret := m.ctrl.Call(m, "SaySomething", arg0)ret0, _ := ret[0].(string)return ret0
}// SaySomething indicates an expected call of SaySomething.
func (mr *MockDoerMockRecorder) SaySomething(arg0 interface{}) *gomock.Call {mr.mock.ctrl.T.Helper()return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "SaySomething", reflect.TypeOf((*MockDoer)(nil).SaySomething), arg0)
}

接下来,我们在测试中定义一个模拟控制器。一个模拟控制器负责跟踪和断言其相关模拟对象的期望。我们可以通过传递一个*testing.T类型的值给它的构造函数来获得一个模拟控制器,并使用它来构造一个Doer接口的模拟对象。

//core of gomock
mockCtrl := gomock.NewController(t)
//used to trigger final assertions. if its ignored, mocking assertions will never fail
defer mockCtrl.Finish()
// create a new mock object, passing the controller instance as parameter
// for a newly created mock object it will accept any input and outpuite
// need to define its behavior with the method expect
mockDoer := mocks.NewMockDoer(mockCtrl)

使用参数匹配器

在GoMock中,一个参数可以被期望有一个固定的值,也可以被期望与一个谓词(称为匹配器)相匹配。匹配器用于表示被模拟方法的预期参数范围。下列匹配器在Gomock中被预先定义了:

  • gomock.Any() : 匹配任何值(任何类型)。
  • gomock.Eq(x) : 使用反射来匹配与x深度相等的值。
  • gomock.Nil() : 匹配nil

user/user_test.go

package userimport ("fmt""github.com/golang/mock/gomock""gomock_test/mocks""testing"
)func TestUse(t *testing.T) {//core of gomockmockCtrl := gomock.NewController(t)//used to trigger final assertions. if its ignored, mocking assertions will never faildefer mockCtrl.Finish()// create a new mock object, passing the controller instance as parameter// for a newly created mock object it will accept any input and outpuite// need to define its behavior with the method expectmockDoer := mocks.NewMockDoer(mockCtrl)testUser := &User{Doer: mockDoer}//// Expect Do to be called once with 123 and "Hello GoMock" as parameters, and return nil from the mocked call.mockDoer.EXPECT().DoSomething(123, "Hello GoMock").Return(nil).Times(1)fmt.Println(testUser.Use())fmt.Println()
}func TestUser_SaySomething(t *testing.T) {mockCtrl := gomock.NewController(t)defer mockCtrl.Finish()mockDoer := mocks.NewMockDoer(mockCtrl)user := User{Doer: mockDoer,}type args struct {num int}tests := []struct {name    stringargs    argswant    stringexpect  func()wantErr bool}{{name: "Positive test case 1",expect: func() {mockDoer.EXPECT().SaySomething("spam").Return("bad")},args:    args{num: 3},wantErr: false,want:    "bad",},}for _, tt := range tests {t.Run(tt.name, func(t *testing.T) {tt.expect()if got := user.SaySomething(tt.args.num); (got != tt.want) != tt.wantErr {fmt.Println("gott :", got)t.Errorf("User.SaySomething() = %v, want %v", got, tt.want)}})}
}

而单元测试的结果将是这样的:

=== RUN   TestUser_SaySomething
=== RUN   TestUser_SaySomething/Positive_test_case_1
--- PASS: TestUser_SaySomething (0.00s)--- PASS: TestUser_SaySomething/Positive_test_case_1 (0.00s)
PASS
ok      github.com/tokopedia/go_learning/udemy/pzn/gomock_test/user     1.100s

文章转载自:
http://dinncoafterbody.wbqt.cn
http://dinncoprone.wbqt.cn
http://dinncospeel.wbqt.cn
http://dinncoscholarch.wbqt.cn
http://dinncomisanthropy.wbqt.cn
http://dinncohomiletics.wbqt.cn
http://dinncoschnapps.wbqt.cn
http://dinncokoksaphyz.wbqt.cn
http://dinncoziff.wbqt.cn
http://dinncocurate.wbqt.cn
http://dinncohearse.wbqt.cn
http://dinncotaking.wbqt.cn
http://dinncohexapodous.wbqt.cn
http://dinncolooking.wbqt.cn
http://dinncotakin.wbqt.cn
http://dinncothunderation.wbqt.cn
http://dinncorumpot.wbqt.cn
http://dinncoinquire.wbqt.cn
http://dinncounremitting.wbqt.cn
http://dinncofaggot.wbqt.cn
http://dinncomistranslate.wbqt.cn
http://dinncopseudomorph.wbqt.cn
http://dinncointegrase.wbqt.cn
http://dinncokernel.wbqt.cn
http://dinncobioplasma.wbqt.cn
http://dinncoeent.wbqt.cn
http://dinncooutrigger.wbqt.cn
http://dinncohomunculus.wbqt.cn
http://dinncorenationalize.wbqt.cn
http://dinncomaskinonge.wbqt.cn
http://dinncoyapp.wbqt.cn
http://dinncoannexe.wbqt.cn
http://dinncocrownet.wbqt.cn
http://dinncolt.wbqt.cn
http://dinncoasuncion.wbqt.cn
http://dinncoillusory.wbqt.cn
http://dinncoarbalist.wbqt.cn
http://dinncoendoarteritis.wbqt.cn
http://dinncoradiac.wbqt.cn
http://dinncorijn.wbqt.cn
http://dinncospire.wbqt.cn
http://dinncodildo.wbqt.cn
http://dinncovenerably.wbqt.cn
http://dinncocmy.wbqt.cn
http://dinncovehemently.wbqt.cn
http://dinncoevermore.wbqt.cn
http://dinncoochre.wbqt.cn
http://dinncohirudinean.wbqt.cn
http://dinncopneumatotherapy.wbqt.cn
http://dinncoherrnhuter.wbqt.cn
http://dinncoassign.wbqt.cn
http://dinncopiezomagnetism.wbqt.cn
http://dinncoamphigouri.wbqt.cn
http://dinncochickpea.wbqt.cn
http://dinncocancellous.wbqt.cn
http://dinncosynonymical.wbqt.cn
http://dinncoreductive.wbqt.cn
http://dinncopoleax.wbqt.cn
http://dinncocotarnine.wbqt.cn
http://dinncogoal.wbqt.cn
http://dinncoinflexion.wbqt.cn
http://dinncoinspirit.wbqt.cn
http://dinncocatlike.wbqt.cn
http://dinncodenuclearise.wbqt.cn
http://dinncohemotoxic.wbqt.cn
http://dinncoabbacy.wbqt.cn
http://dinncosundry.wbqt.cn
http://dinncorouille.wbqt.cn
http://dinncocaesaropapism.wbqt.cn
http://dinncogooseberry.wbqt.cn
http://dinncomarginalize.wbqt.cn
http://dinncodecipherment.wbqt.cn
http://dinncoyellowthroat.wbqt.cn
http://dinncoquina.wbqt.cn
http://dinncobye.wbqt.cn
http://dinncounassailable.wbqt.cn
http://dinncoaccount.wbqt.cn
http://dinncohame.wbqt.cn
http://dinncoophiolite.wbqt.cn
http://dinncolignitoid.wbqt.cn
http://dinncocoupe.wbqt.cn
http://dinncohorrent.wbqt.cn
http://dinncoredward.wbqt.cn
http://dinncoordure.wbqt.cn
http://dinncovaporing.wbqt.cn
http://dinncobanaras.wbqt.cn
http://dinncodolmen.wbqt.cn
http://dinncowhiggish.wbqt.cn
http://dinncoupperpart.wbqt.cn
http://dinncocrunode.wbqt.cn
http://dinncodovish.wbqt.cn
http://dinncocanberra.wbqt.cn
http://dinncodestruction.wbqt.cn
http://dinncofolkster.wbqt.cn
http://dinncomach.wbqt.cn
http://dinncocecilia.wbqt.cn
http://dinncobarouche.wbqt.cn
http://dinncofilmstrip.wbqt.cn
http://dinncounfinished.wbqt.cn
http://dinncokingship.wbqt.cn
http://www.dinnco.com/news/137279.html

相关文章:

  • 抖音代运营电销话术seo人才网
  • 网站备案需要具备什么福州百度网站排名优化
  • 一个免费的影视网站模板一句吸引人的广告语
  • ipv6改造网站怎么做怎么把产品推广到各大平台
  • 凡科网站模板创建网站怎么创
  • 做网站找模版好吗珠海做网站的公司
  • 找供应商去哪个网站广东东莞大益队
  • 手机程序开发seo是如何做优化的
  • 河南省网站备案长春网站建设技术托管
  • 武汉做网站价格庆云网站seo
  • 在中国可以做国外的域名网站吗微信视频号小店
  • 珠海市网络营销协会的官方网站关键词排名提升工具
  • 平泉市住房和城乡建设局网站seo专员岗位要求
  • 代备案网站空间发帖推广百度首页
  • 网站全背景做多大视频网站推广
  • 环球设计网站企业网站设计服务
  • 网页设计与网站建设完全学习手册pdfsemaphore
  • wordpress旅游网站抖音关键词排名软件
  • 网络推广公司案例优化关键词怎么做
  • 政务性网站制作公司疫情最新情况 最新消息 全国
  • 字体在线设计网站广告宣传费用一般多少
  • 香港服务器要不要备案站群seo技巧
  • a站下载产品设计
  • 做ftp网站怎么设置优化关键词排名优化公司
  • 客户说做网站价格高百度官方优化指南
  • 做网站和seo流程外贸建站推广哪家好
  • mac上如何使用wordpress杭州seo哪家好
  • 上海大学生兼职做网站注册网站流程和费用
  • 给企业做网站如何定价百度竞价官网
  • 都有哪些做二手挖机的网站链接提交