Mock

简介

Goravel 所有功能都使用 facades 实现,而所有的 facades 均由接口构成。因此配合 stretchr/testify 的 mock 功能,Goravel 可以提供优秀的测试体验。

Mock facades.Cache

  1. func Cache() string {
  2. if err := facades.Cache.Put("name", "goravel", 1*time.Minute); err != nil {
  3. fmt.Println("cache.put.error", err)
  4. }
  5. return facades.Cache.Get("name", "test").(string)
  6. }
  7. func TestCache(t *testing.T) {
  8. mockCache := goravelmock.Cache()
  9. mockCache.On("Put", "name", "goravel", mock.Anything).Return(nil).Once()
  10. mockCache.On("Get", "name", "test").Return("hwb").Once()
  11. res := Cache()
  12. assert.Equal(t, res, "hwb")
  13. }

Mock facades.Config

  1. func Config() string {
  2. return facades.Config.GetString("app.name", "test")
  3. }
  4. func TestConfig(t *testing.T) {
  5. mockConfig := goravelmock.Config()
  6. mockConfig.On("GetString", "app.name", "test").Return("hwb").Once()
  7. res := Config()
  8. assert.Equal(t, res, "hwb")
  9. }

Mock facades.Artisan

  1. func ArtisanCall() {
  2. facades.Artisan.Call("list")
  3. }
  4. func TestArtisan(t *testing.T) {
  5. mockArticle := goravelmock.Artisan()
  6. mockArticle.On("Call", "list").Once()
  7. assert.NotPanics(t, func() {
  8. ArtisanCall()
  9. })
  10. }

Mock facades.Orm

  1. func Orm() error {
  2. if err := facades.Orm.Query().Create(&Test{}); err != nil {
  3. return err
  4. }
  5. var test Test
  6. return facades.Orm.Query().Where("id = ?", 1).Find(&test)
  7. }
  8. func TestOrm(t *testing.T) {
  9. mockOrm, mockOrmDB, _ := goravelmock.Orm()
  10. mockOrm.On("Query").Return(mockOrmDB)
  11. mockOrmDB.On("Create", mock.Anything).Return(nil).Once()
  12. mockOrmDB.On("Where", "id = ?", 1).Return(mockOrmDB).Once()
  13. mockOrmDB.On("Find", mock.Anything).Return(nil).Once()
  14. assert.Nil(t, Orm())
  15. }
  16. func Transaction() error {
  17. return facades.Orm.Transaction(func(tx contractorm.Transaction) error {
  18. var test Test
  19. if err := tx.Create(&test); err != nil {
  20. return err
  21. }
  22. var test1 Test
  23. return tx.Where("id = ?", test.ID).Find(&test1)
  24. })
  25. }
  26. func TestTransaction(t *testing.T) {
  27. mockOrm, _, mockOrmTransaction := goravelmock.Orm()
  28. mockOrm.On("Transaction", mock.Anything).Return(func(txFunc func(tx orm.Transaction) error) error {
  29. return txFunc(mockOrmTransaction)
  30. })
  31. var test Test
  32. mockOrmTransaction.On("Create", &test).Return(func(test2 interface{}) error {
  33. test2.(*Test).ID = 1
  34. return nil
  35. }).Once()
  36. mockOrmTransaction.On("Where", "id = ?", uint(1)).Return(mockOrmTransaction).Once()
  37. mockOrmTransaction.On("Find", mock.Anything).Return(nil).Once()
  38. assert.Nil(t, Transaction())
  39. }
  40. func Begin() error {
  41. tx, _ := facades.Orm.Query().Begin()
  42. user := models.User{Name: "Goravel"}
  43. if err := tx.Create(&user); err != nil {
  44. return tx.Rollback()
  45. } else {
  46. return tx.Commit()
  47. }
  48. }

Mock facades.Event

  1. func Event() error {
  2. return facades.Event.Job(&events.TestEvent{}, []contractevent.Arg{
  3. {Type: "string", Value: "abcc"},
  4. {Type: "int", Value: 1234},
  5. }).Dispatch()
  6. }
  7. func TestEvent(t *testing.T) {
  8. mockEvent, mockTask := goravelmock.Event()
  9. mockEvent.On("Job", mock.Anything, mock.Anything).Return(mockTask).Once()
  10. mockTask.On("Dispatch").Return(nil).Once()
  11. assert.Nil(t, Event())
  12. }

Mock facades.Log

facades.Log 没有实现 mock,而是使用 fmt 代替了实际的日志输出,便于测试过程中调试。

  1. func Log() {
  2. facades.Log.Debug("test")
  3. }
  4. func TestLog(t *testing.T) {
  5. goravelmock.Log()
  6. Log()
  7. }

Mock facades.Mail

  1. func Mail() error {
  2. return facades.Mail.From(mail.From{Address: "example@example.com", Name: "example"}).
  3. To([]string{"example@example.com"}).
  4. Content(mail.Content{Subject: "Subject", Html: "<h1>Hello Goravel</h1>"}).
  5. Send()
  6. }
  7. func TestMail(t *testing.T) {
  8. mockMail := goravelmock.Mail()
  9. mockMail.On("From", mail.From{Address: "example@example.com", Name: "example"}).Return(mockMail)
  10. mockMail.On("To", []string{"example@example.com"}).Return(mockMail)
  11. mockMail.On("Content", mail.Content{Subject: "Subject", Html: "<h1>Hello Goravel</h1>"}).Return(mockMail)
  12. mockMail.On("Send").Return(nil)
  13. assert.Nil(t, Mail())
  14. }

Mock facades.Queue

  1. func Queue() error {
  2. return facades.Queue.Job(&jobs.TestSyncJob{}, []queue.Arg{}).Dispatch()
  3. }
  4. func TestQueue(t *testing.T) {
  5. mockQueue, mockTask := goravelmock.Queue()
  6. mockQueue.On("Job", mock.Anything, mock.Anything).Return(mockTask).Once()
  7. mockTask.On("Dispatch").Return(nil).Once()
  8. assert.Nil(t, Queue())
  9. }