如何克服旋服务二分法
2025-11-05 12:23
让我们追捧这段字符串的主要优点:
这个文件缺少了一个加载数组,它不沾染IP本身,而是一个接口。 这个IP缺少了一种codice_服务于的有用新方法,从未人所只需告诉他 API 的仅仅西南侧。只只需用作这些新方法展开 API codice_。我们的客户到时了。让我们在一个事例中亦会用作它。
API codice_的无缝做到我们想用作上会的中文IP来中文电子邮件内容。在服务于之外的某个地方,我们将有一个看起来像这样的处理程序。
func GenerateEmail(ctx context.Context, machine models.Machine, language string) ([]string, error) { emailContent, err := buildEmailContent(ctx, machine) if err != nil { return nil, err } translationClient, err := translations.InitClient(ctx) if err != nil { return nil, err } translatedEmailContent, err = translationClient.TranslateText(ctx, language, emailContent) if err != nil { return err } return translatedEmailContent, nil}
在真实的生产字符串中亦会,该buildEmailContent新方法不亦会是私有财产的,并且亦会被单元飞行测试布满。这是一个重构的事例。
我们从未做到了我们的第一个期望。对另一个服务于的 API codice_是无缝的。从未说明的 API codice_。从未字符串块准备副标题以在金融业务逻辑上中亦会间移除SSL。字符串优雅优美。另一个书本此字符串的共同程序员可以专注于逻辑上。有了这个做到,我们可以尽快通过改变工具箱的版本来从 JSON 待机到 gRPC。
但是有一个很大的BUT。在此配置GenerateEmail中亦会无法展开单元飞行测试。用作中文IP亦会阻止它。例如,Go 从未缺少回击新方法的工具。那么我们将如何化解这个疑虑呢?
为共同开发隔离服务于我们将如何修改新方法以使其可飞行测试?有用的化解方案是亦非新方法之外启动中文IP。也就是说,该新方法所只需接收它。
为什么我们关心我们在哪里加载IP?这样我们就可以用实时IP替换IP。它将做到大致相同的接口,我们用作mockgen转化它。我们在调试生态环境中亦会用作真正的中文IP。单元飞行测试的实时IP。
类似于于的化解方案是将IP作为参数传送给新方法。这很不易,但很丑陋。这很丑,因为在比较简单的服务于中亦会,我们将有所只需许多IP的流水。在从未确信它的意味著,我们开始将一堆IP传送给每个新方法。它悄悄变得混乱。
一个更优美的化解方案是用作词法来传送IP。所述关于词法的 golang 元数据:“仅将词法值用作传输进程和 API 的请求范围数据,而不用作将可选参数传送给数组。”
通过词法传送IP是一种可接受的恰巧。所只需一个有用的新方法将所有所只需的IP设置到词法中亦会。API codice_将在中亦会间件中亦会用作此新方法。来自发布/订阅数组调用的基于事件的流水程将很强类似于的做到。我们所只需维护它是我们新方法的先决条件。飞行测试时,我们将准备一个自度量词法,以及所只需的实时IP。
为了做到这一点,我们所只需向我们的IP移除两个新方法。
const translationsClientKey = "translations"
func SetTranslationsClient(ctx context.Context, c Client) context.Context { return context.WithValue(ctx, translationsClientKey, c)}
func GetTranslationsClient(ctx context.Context) (Client, error) { _client := ctx.Value(translationsClientKey)
if client, ok := _client.(Client); ok { return client, nil } else { return nil, errors.New("client not in context") }}
您亦会确信 setter 和 getter 用作的是接口而不是骨架。这是因为我们的IP和我们的实时IP都做到了大致相同的接口。setter 和 getter 两者都相容。我们GenerateEmail将有一个重新做到:
func GenerateEmail(ctx context.Context, machine models.Machine, language string) ([]string, error) { emailContent, err := buildEmailContent(ctx, machine) if err != nil { return nil, err } translationClient, err := translations.GetTranslationsClient(ctx) if err != nil { return nil, err } translatedEmailContent, err = translationClient.TranslateText(ctx, language, emailContent) if err != nil { return nil, err } return translatedEmailContent, nil}
现在我们的新方法悄悄用作它缺少的IP,我们可以对其展开单元飞行测试。
完美的单元飞行测试重新做到将而无须这个有用的单元飞行测试。
func TestEmptyEmailOnEmptyMachine(t *testing.T) { // creating a context from scratch ctx := context.Background() // initializing a mock controller and client mockCtrl := gomock.NewController(t) translationsClient := mockTranslations.NewMockClient(mockCtrl) // setting expectation and return values translationsClient.EXPECT().TranslateText(gomock.Any(), "en", []string{}).Return([]string{}, nil) // adding the mock client to the ctx ctx := translations.SetTransalationsClient(ctx, translationsClient) // testing that if the machine model is empty nothing is being generated emailContent, err := GenerateEmail(ctx, models.Machine{}, "en") assert.Nil(t, err) assert.Equal(t, 0, len(emailContent))}
我们从未实时了 API codice_,飞行测试可以在隔离生态环境中亦会调试。用作此化解方案,我们可以在服务于中亦会编撰比较简单的逻辑上并在几毫秒内对其展开飞行测试。以这种方式也管理工作工作对速度有很大的影响。
用作 API 元件,我们化解了微服务于的两个主要局限病态。互动很共处。服务于可以隔离。在不损害我们的字符串或框架的意味著。我们的服务于协同管理工作工作,而我们完全控制每一项服务于。
我们仍然所只需集成飞行测试来维护服务于二者之间的良好无线电通信。我们不依赖它们来飞行测试我们服务于的之外行为。
元件 API 只是八面体框架的一小外。八面体框架而无须我们编撰与工程建设分立的字符串。我们用作大致相同的逻辑上展开异步无线电通信、数据奎、调用……
我们花了一些时间来微调服务于、IP和 go-api 二者之间的界限。其中亦会一些疑虑仍在辩论中亦会。无论如何在用作IP的服务于中亦会还是在IP中亦会度量实时鼓动?IP无论如何拥有自己的存储奎还是位于其服务于存储奎中亦会?我很感到高兴获您自己的实施以及您如何化解此疑虑的反馈。
。苏州男科专科医院哪里好昆明看妇科专业医院
南京看肛肠去哪个医院好
太原看牛皮癣哪里最好
沈阳看牛皮癣去哪家医院最好

-
把握好这几点,试管婴儿成功率极难!
对于不育症的外科手术,越来越百余人选择通过吸管婴儿来要兔子,但是吸管婴儿也是医疗保健,不是万能的,这就关的到获得成功赴援的原因,总有人喜欢问,怎么降低吸管婴儿的获得成功赴援?除了医院的选择,这跟

-
杭州地铁萌娃肖像权案宣判,孩子妈:满意结果,致谢支持我的爱国网友
接连引来引起争议广泛关注的金华“地铁萌娃”肖像画权弊全因被告。 根据多才体育新闻此前报道,香蕉亲爱的亲爱的的萌娃特写,说什么是在金华地铁上拍出的,杜某却在其发布的网易上说是“冲绳地
- 11-10元旦家宴菜单已出,8菜2汤,照顾到男女老幼,搭配合理家人品尝
- 11-10“眯眯眼”引发的争执:模特发声,三只松鼠到底冤不冤?
- 11-10乳腺增生结节调理的最好方法是什么?芭比一定要了解!
- 11-10半月谈微评:三尺讲台上,需要的是爱而不是性虐待
- 11-10买牛肉时,选“脱的”还是“湿的”切记6不买,牛肉新鲜美味
- 11-10爱喝酒的人力资源知道的方法,此时间喝酒对肝脏最好,还能促血液循环
- 11-10神话故事:男子救下小蛇,次日蛇托梦:赶紧把你家饭菜倒了
- 11-10买牛肉时,三种牛肉再高昂都不要买,很多人中招,肉贩:我从不吃
- 11-10柳州女子开热水器洗澡后中毒昏迷,爱犬连舔随身携带刨救醒主人
- 11-10多给家人吃这3道菜,血管干净不堵塞,远离三高,做法简便