如何在表驅動測試中覆寫模擬呼叫期望
php小編小新今天為大家介紹一個在表格驅動測試中覆寫模擬呼叫期望的方法。表驅動測試是一種有效的測試技術,能夠透過資料驅動的方式進行測試,提高程式碼的可維護性和可擴展性。在測試中,我們經常需要模擬呼叫期望,以確保被測試的程式碼行為符合預期。本文將詳細介紹如何使用表格驅動測試來實現模擬呼叫期望的覆蓋,幫助開發人員更好地進行單元測試。
問題內容
在進行表格驅動測試時,我使用mockery
產生的一些模擬,並設定一些方法呼叫期望,這些期望取決於每個測試案例的數據集中提供的數據。我面臨的問題是,模擬呼叫始終傳回第一個測試案例中期望的結果集,而不是為執行的測試案例定義的結果集。
func (s *MyTestSuite) TestMySampleTest() { testCases := []struct { Name string Requests []*service.CreateCredentialRequest }{ { Name: "first case", mockedResult: 1, expected: 1, }, { Name: "second case", mockedResult: 2, expected: 2, }, } for _, tc := range testCases { s.Run(tc.Name, func() { s.someMock.On("SomeMethodCall", mock.Anything).Return(tc.mockedResult) result := s.SUT.SomeMethodThatCallsTheMockedObe() s.Equal(expected, result) }) } }
當我執行此測試時,第二種情況失敗,因為結果是1
而不是預期的2
,我可以看到問題是模擬方法返回 1
(為第一個測試案例設定的值)而非 2
(為目前測試案例設定的值)。
知道如何解決這個問題嗎?
解決方法
這可能不是最優雅的解決方案,我想知道是否還有其他方法可以做到這一點,但目前,我已經找到了這個解決方案。它包括為表驅動測試運行的每個子測試產生一個新的模擬,因此在每個子測試中,我們使用一個全新的模擬實例,該實例沒有從先前的子測試中設定任何期望。考慮到我使用 testify.suite
來組織和處理我的測試,這樣做就像在每個子測試中手動呼叫 s.setuptest()
方法一樣簡單:
// SetupTest is executed before every test is run, I instantiate the SUT and // its dependencies here. func (s *MyTestSuite) SetupTest() { // Instantiate the mock s.someMock = mocks.NewSomeMock(s.T()) // Instantiate the SUT, injecting the mock through the constructor function s.SUT = NewSUT(s.someMock) } func (s *MyTestSuite) TestMySampleTest() { testCases := []struct { Name string Requests []*service.CreateCredentialRequest }{ // test cases here } for _, tc := range testCases { s.Run(tc.Name, func() { // Manually calling s.SetupTest() to generate new instances of the mocks in every subtest. // If we don't do this, the mock will always return the first expectation set (the one set for the first test case). s.SetupTest() // Here comes the logic of the text as we had it before s.someMock.On("SomeMethodCall", mock.Anything).Return(tc.mockedResult) result := s.SUT.SomeMethodThatCallsTheMockedObe() s.Equal(expected, result) }) } }
以上是如何在表驅動測試中覆寫模擬呼叫期望的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

OpenSSL,作為廣泛應用於安全通信的開源庫,提供了加密算法、密鑰和證書管理等功能。然而,其歷史版本中存在一些已知安全漏洞,其中一些危害極大。本文將重點介紹Debian系統中OpenSSL的常見漏洞及應對措施。 DebianOpenSSL已知漏洞:OpenSSL曾出現過多個嚴重漏洞,例如:心臟出血漏洞(CVE-2014-0160):該漏洞影響OpenSSL1.0.1至1.0.1f以及1.0.2至1.0.2beta版本。攻擊者可利用此漏洞未經授權讀取服務器上的敏感信息,包括加密密鑰等。

後端學習路徑:從前端轉型到後端的探索之旅作為一名從前端開發轉型的後端初學者,你已經有了nodejs的基礎,...

Go語言中用於浮點數運算的庫介紹在Go語言(也稱為Golang)中,進行浮點數的加減乘除運算時,如何確保精度是�...

Go爬蟲Colly中的Queue線程問題探討在使用Go語言的Colly爬蟲庫時,開發者常常會遇到關於線程和請求隊列的問題。 �...

在BeegoORM框架下,如何指定模型關聯的數據庫?許多Beego項目需要同時操作多個數據庫。當使用Beego...

Go語言中字符串打印的區別:使用Println與string()函數的效果差異在Go...

GoLand中自定義結構體標籤不顯示怎麼辦?在使用GoLand進行Go語言開發時,很多開發者會遇到自定義結構體標籤在�...

Go語言中使用RedisStream實現消息隊列時類型轉換問題在使用Go語言與Redis...
