使用接口进行模拟以进行测试

问题描述

我对 Go 很陌生,而且我来自 OOP 语言。现在,接口和类的概念似乎完全不同。

我想知道在测试的情况下模拟如何工作。我的困惑是是否可以将 async deleteFunction () { try { this.deleteLoading = true; await this.$fire.storage .ref("CVs/") .child(this.$store.state.auth.user.uid) .delete(); await this.$fire.firestore .collection("users") .doc(this.$store.state.auth.user.uid) .update({ cv: this.$fire.firestore.FieldValue.delete(),}); this.cvLink = null; this.deleteLoading = false; this.$notifier.showMessage({ color: "success",content: "Current CV Deleted Successfully",}); } catch (err) { this.$notifier.showMessage({ color: "red",content: err,}); this.deleteLoading = false; } },} 用作类,以及下面的方法是否符合您的想法?假设 struct 用于真实数据,DefaultArticlesRepository 用于模拟数据。

MockArticlesRepository

解决方法

首先,我建议您使用 https://github.com/vektra/mockery 自动生成基于接口的模拟结构。实现像您这样的模拟结构是可以的,但我认为如果您真的不需要该结构的非常特殊的行为,那只会浪费您的时间和精力。

其次,我们不需要像您在代码中那样测试模拟结构。

assert.Equal(t,mockProvider.GetArticleSections(),[]ArticleSectionResponse{
    {
        Title: "Mock response",Tag:   "Mock Tag",},})

因此,当我们使用模拟结构时,假设结构 a 是结构 b 的依赖项。例如:

type A interface {
    DoTask() bool
} 

type a struct {}

func (sa *a) DoTask() bool {
    return true
}

type b struct {
    a A
}

func (sb *b) DoSomething() bool {
    //Do some logic
    sb.a.DoTask();
    //Do some logic
    return true;
}

并且您想测试结构 b 的函数 DoSomething。当然,在这种情况下,您并不关心也不想测试结构 a 的函数 DoTask。然后,您只需在测试中提供一个 struct a 的模拟来构建 b。此模拟还可以帮助您避免在测试 struct b 时遇到与 struct a 相关的任何问题。 现在你的测试应该是这样的:

func (s *TestSuiteOfStructB) TestDoSomething_NoError() {
    //Suppose that mockedOfA  is a mock of struct a
    instanceOfB := b{a: mockedOfA}
    mockedOfA.On("DoTask").Return(true)
    actualResult := instanceOfB.DoSomething()
    s.Equal(true,actualResult)
}

最后,这只是一件小事,但没有看到您的ArticleSectionsProvider 的明确责任。