亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何為從外部包導入的方法創建單元測試期望?

如何為從外部包導入的方法創建單元測試期望?

Go
慕尼黑8549860 2023-01-03 15:51:02
我有這個功能,我想測試。我使用 testify 創建單元測試。// calculate.goimport (  "context"  "errors"  "testing"  "github.com/jmoiron/sqlx")func (u usecase) CalculateTransaction(ctx context.Context, ID int64) (err error) {  // tx has the type of `*sqlx.Tx`, which I got from that imported package above  tx, err := u.sqlRepo.BeginTX()  if err != nil {    return err  }  defer func() {    if tx != nil {    err = tx.Rollback()      if err != nil {        return err      }    }  }    err = tx.Commit()  if err != nil {    return err  }  return nil}這應該是單元測試// calculate_test.gofunc TestCalculate(t *testing.T) {  var tx *sqlx.Tx  var expectedError string  mockSQL = new(mocks.SQLRepository)  mockSQL.On("BeginTX").Return(tx, nil)  // mock tx.Commit() here  // mock tx.Rollback() here  usecase := &calculationUsecase{    sqlRepo: mockSQL  }  actualError := usecase.CalculateTransaction(context.Background(), 1)  require.EqualError(t, actualError, expectedError)}我的問題是tx.Commit()和tx.Rollback()方法。如果我以這種方式運行它,我會得到一個invalid memory address or nil pointer dereference錯誤,這是有道理的,因為我沒有為那些方法調用設置期望。但我不知道如何創建它。這些方法本身是從外部包導入的,即"github.com/jmoiron/sqlx". 我不確定我是否需要為位于根目錄的外部包創建一個模擬對象,或者是否有另一種方法可以做到這一點而不必模擬它。任何人都可以告訴我如何解決這個問題或如何設置期望?我不知道我能不能做到,但我也試過像這樣將單元測試(使用 testify)與 DataDog 的 sqlmock 結合起來
查看完整描述

1 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

在您的測試中,您在數據庫提供者級別模擬數據庫,不再需要模擬。


沒有冗余模擬的測試:


func TestCalculate(t *testing.T) {

  

  // transaction is created inside `CalculateTransaction`, it will be started against mocked DB

  // var tx *sqlx.Tx

  var expectedError string


  dbMock, mock, err := sqlmock.New()

  if err != nil {

    t.Fatalf("an error '%s' was not expected", err)

  }

  defer dbMock.Close()


  // we use sql mock - no need to mock DB methods

  // mockSQL = new(mocks.SQLRepository)

  // mockSQL.On("BeginTX").Return(tx, nil)

  

  mock.ExpectCommit()


  // here you can add ExpectQuery or ExpectExec if usecase do any DB work


  mock.ExpectRollback()


  usecase := &calculationUsecase{

    sqlRepo: dbMock

  }


  actualError := usecase.CalculateTransaction(context.Background(), 1)

  require.EqualError(t, actualError, expectedError)


  // it is good practice to check is all expectations are met

  err = mock.ExpectationsWereMet()

  require.NoError(t, err)

}


查看完整回答
反對 回復 2023-01-03
  • 1 回答
  • 0 關注
  • 88 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號