Mock
简介
Goravel 所有功能都使用 facades
实现,而所有的 facades
均由接口构成。因此配合 stretchr/testify 的 mock 功能,Goravel 可以提供优秀的测试体验。
Mock facades.Cache
func Cache() string {
if err := facades.Cache.Put("name", "goravel", 1*time.Minute); err != nil {
fmt.Println("cache.put.error", err)
}
return facades.Cache.Get("name", "test").(string)
}
func TestCache(t *testing.T) {
mockCache := goravelmock.Cache()
mockCache.On("Put", "name", "goravel", mock.Anything).Return(nil).Once()
mockCache.On("Get", "name", "test").Return("hwb").Once()
res := Cache()
assert.Equal(t, res, "hwb")
}
Mock facades.Config
func Config() string {
return facades.Config.GetString("app.name", "test")
}
func TestConfig(t *testing.T) {
mockConfig := goravelmock.Config()
mockConfig.On("GetString", "app.name", "test").Return("hwb").Once()
res := Config()
assert.Equal(t, res, "hwb")
}
Mock facades.Artisan
func ArtisanCall() {
facades.Artisan.Call("list")
}
func TestArtisan(t *testing.T) {
mockArticle := goravelmock.Artisan()
mockArticle.On("Call", "list").Once()
assert.NotPanics(t, func() {
ArtisanCall()
})
}
Mock facades.Orm
func Orm() error {
if err := facades.Orm.Query().Create(&Test{}); err != nil {
return err
}
var test Test
return facades.Orm.Query().Where("id = ?", 1).Find(&test)
}
func TestOrm(t *testing.T) {
mockOrm, mockOrmDB, _ := goravelmock.Orm()
mockOrm.On("Query").Return(mockOrmDB)
mockOrmDB.On("Create", mock.Anything).Return(nil).Once()
mockOrmDB.On("Where", "id = ?", 1).Return(mockOrmDB).Once()
mockOrmDB.On("Find", mock.Anything).Return(nil).Once()
assert.Nil(t, Orm())
}
func Transaction() error {
return facades.Orm.Transaction(func(tx contractorm.Transaction) error {
var test Test
if err := tx.Create(&test); err != nil {
return err
}
var test1 Test
return tx.Where("id = ?", test.ID).Find(&test1)
})
}
func TestTransaction(t *testing.T) {
mockOrm, _, mockOrmTransaction := goravelmock.Orm()
mockOrm.On("Transaction", mock.Anything).Return(func(txFunc func(tx orm.Transaction) error) error {
return txFunc(mockOrmTransaction)
})
var test Test
mockOrmTransaction.On("Create", &test).Return(func(test2 interface{}) error {
test2.(*Test).ID = 1
return nil
}).Once()
mockOrmTransaction.On("Where", "id = ?", uint(1)).Return(mockOrmTransaction).Once()
mockOrmTransaction.On("Find", mock.Anything).Return(nil).Once()
assert.Nil(t, Transaction())
}
func Begin() error {
tx, _ := facades.Orm.Query().Begin()
user := models.User{Name: "Goravel"}
if err := tx.Create(&user); err != nil {
return tx.Rollback()
} else {
return tx.Commit()
}
}
Mock facades.Event
func Event() error {
return facades.Event.Job(&events.TestEvent{}, []contractevent.Arg{
{Type: "string", Value: "abcc"},
{Type: "int", Value: 1234},
}).Dispatch()
}
func TestEvent(t *testing.T) {
mockEvent, mockTask := goravelmock.Event()
mockEvent.On("Job", mock.Anything, mock.Anything).Return(mockTask).Once()
mockTask.On("Dispatch").Return(nil).Once()
assert.Nil(t, Event())
}
Mock facades.Log
facades.Log
没有实现 mock,而是使用 fmt
代替了实际的日志输出,便于测试过程中调试。
func Log() {
facades.Log.Debug("test")
}
func TestLog(t *testing.T) {
goravelmock.Log()
Log()
}
Mock facades.Mail
func Mail() error {
return facades.Mail.From(mail.From{Address: "example@example.com", Name: "example"}).
To([]string{"example@example.com"}).
Content(mail.Content{Subject: "Subject", Html: "<h1>Hello Goravel</h1>"}).
Send()
}
func TestMail(t *testing.T) {
mockMail := goravelmock.Mail()
mockMail.On("From", mail.From{Address: "example@example.com", Name: "example"}).Return(mockMail)
mockMail.On("To", []string{"example@example.com"}).Return(mockMail)
mockMail.On("Content", mail.Content{Subject: "Subject", Html: "<h1>Hello Goravel</h1>"}).Return(mockMail)
mockMail.On("Send").Return(nil)
assert.Nil(t, Mail())
}
Mock facades.Queue
func Queue() error {
return facades.Queue.Job(&jobs.TestSyncJob{}, []queue.Arg{}).Dispatch()
}
func TestQueue(t *testing.T) {
mockQueue, mockTask := goravelmock.Queue()
mockQueue.On("Job", mock.Anything, mock.Anything).Return(mockTask).Once()
mockTask.On("Dispatch").Return(nil).Once()
assert.Nil(t, Queue())
}