第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

如何比較/匹配模擬中的閉包?

如何比較/匹配模擬中的閉包?

Go
炎炎設計 2022-05-18 15:55:58
模擬方法接受閉包。我想知道如何創(chuàng)建自定義匹配器(https://godoc.org/github.com/golang/mock/gomock#Matcher):閉包本身又使用私有結(jié)構(gòu) - 這意味著我什至不能在我的測試以檢查它是否符合預期。我正在 nlopes/slack ( https://github.com/nlopes/slack ) 的幫助下使用 Slack API 開發(fā)一個小型應用程序。為了測試,我用 gomock 模擬 nlopes/slack。為此,我創(chuàng)建了界面type slackAPI interface {    OpenConversation(*slack.OpenConversationParameters) (*slack.Channel, bool, bool, error)    PostMessage(channelID string, options ...slack.MsgOption) (string, string, error)    GetUserByEmail(email string) (*slack.User, error)}我在測試 OpenConversation 或 GetUserByEmail 時沒有問題,例如slackAPIClient.    EXPECT().    GetUserByEmail("some@email.com").    Return(slackUserJohndoe, nil).    Times(1)當涉及到 PostMessage 時,事情變得更加復雜。在主代碼中,調(diào)用看起來像_, _, err := slackAPIClient.PostMessage(channel.ID, slack.MsgOptionText(message, false))而 slack.MsgOptionText (來自 nlopes/slack)實際上正在返回閉包:func MsgOptionText(text string, escape bool) MsgOption {    return func(config *sendConfig) error {        if escape {            text = slackutilsx.EscapeMessage(text)        }        config.values.Add("text", text)        return nil    }}由于方法接受關閉,我需要創(chuàng)建自定義 gomock 匹配器(https://godoc.org/github.com/golang/mock/gomock#Matcher)。自定義匹配器本身不是問題,它看起來像type higherOrderFunctionEqMatcher struct {    x interface{}}func (e hofEqMatcher) Matches(x interface{}) bool {    //return m.x == x    return true}func (e hofEqMatcher) String(x interface{}) string {    return fmt.Sprintf("is equal %v", e.x)}但是,由于 MsgOptionText 使用 nlopes/slack 私有結(jié)構(gòu) sendConfig,我想知道如何在我的測試范圍內(nèi)使用它來檢查與預期的相等性。我應該如何解決這樣的問題?
查看完整描述

1 回答

?
斯蒂芬大帝

TA貢獻1827條經(jīng)驗 獲得超8個贊

牢記這一點

  1. 在 Golang 你不能比較函數(shù)

  2. 在這種精確的情況下,我不能通過調(diào)用閉包本身來進行間接測試(因為它使用私有 3rd 方庫的結(jié)構(gòu)作為參數(shù))

我找到的解決方案是模擬 slack.MsgOptionText(message, false),然后返回 PostMessage(channelID string, options ...slack.MsgOption) 的閉包:


type slackMsgCreator interface {

    MsgOptionText(string, bool) slack.MsgOption

}


type slackMsgCreatorInst struct{}


func (s slackMsgCreatorInst) MsgOptionText(text string, escape bool) slack.MsgOption {

    return slack.MsgOptionText(text, escape)

}

...


slackMsgCreator.

    EXPECT().

    MsgOptionText("Dear John Doe, message goes here", false).

    Return(slack.MsgOptionText("Dear John Doe, message goes here", false)).

    Times(1)

而且,至于 PostMessage - 正如評論中所建議的那樣,我唯一可以檢查的是閉包不是零:


slackAPIClient.

    EXPECT().

    PostMessage("ABCDE", Not(Nil())).

    AnyTimes()


查看完整回答
反對 回復 2022-05-18
  • 1 回答
  • 0 關注
  • 127 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號