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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

在 Go 中模擬 MongoDB 響應(yīng)

在 Go 中模擬 MongoDB 響應(yīng)

Go
慕妹3146593 2023-06-26 17:32:59
我正在從 MongoDB 獲取文檔并將其傳遞給函數(shù)transform,例如var doc map[string]interface{}err := collection.FindOne(context.TODO(), filter).Decode(&doc) result := transform(doc)我想為 編寫單元測試transform,但我不確定如何模擬來自 MongoDB 的響應(yīng)。理想情況下我想設(shè)置這樣的東西:func TestTransform(t *testing.T) {    byt := []byte(`    {"hello": "world",     "message": "apple"} `)    var doc map[string]interface{}    >>> Some method here to Decode byt into doc like the code above <<<    out := transform(doc)    expected := ...    if diff := deep.Equal(expected, out); diff != nil {        t.Error(diff)    }}一種方法是json.Unmarshalinto doc,但這有時(shí)會(huì)產(chǎn)生不同的結(jié)果。例如,如果 MongoDB 中的文檔中有一個(gè)數(shù)組,那么該數(shù)組將被解碼為doc類型bson.A而不是[]interface{}類型。
查看完整描述

3 回答

?
郎朗坤

TA貢獻(xiàn)1921條經(jīng)驗(yàn) 獲得超9個(gè)贊

我認(rèn)為您可以嘗試類似以下的操作(當(dāng)然,您可能需要對(duì)此進(jìn)行調(diào)整和實(shí)驗(yàn)):

func TestTransform(t *testing.T) {

? ? mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))

? ? defer mt.Close()


? ? mt.Run("find & transform", func(mt *mtest.T) {

? ? ? ? myollection = mt.Coll

? ? ? ? expected := myStructure{...}


? ? ? ? mt.AddMockResponses(mtest.CreateCursorResponse(1, "foo.bar", mtest.FirstBatch, bson.D{

? ? ? ? ? ? {"_id", expected.ID},

? ? ? ? ? ? {"field-1", expected.Field1},

? ? ? ? ? ? {"field-2", expected.Field2},

? ? ? ? }))


? ? ? ? response, err := myFindFunction(expected.ID)

? ? ? ? if err != nil {

? ? ? ? ? ? t.Error(err)

? ? ? ? }


? ? ? ? out := transform(response)

? ? ? ? if diff := deep.Equal(expected, out); diff != nil {

? ? ? ? ? ? t.Error(diff)

? ? ? ? }

? ? })

}

或者,您可以通過與 Docker 容器的集成測試以自動(dòng)化的方式執(zhí)行更真實(shí)的測試。

查看完整回答
反對(duì) 回復(fù) 2023-06-26
?
萬千封印

TA貢獻(xiàn)1891條經(jīng)驗(yàn) 獲得超3個(gè)贊

編寫可測試的最佳解決方案可能是將代碼提取到 DAO 或數(shù)據(jù)存儲(chǔ)庫。您將定義一個(gè)接口來返回您需要的內(nèi)容。這樣,您就可以使用模擬版本進(jìn)行測試。


// repository.go

type ISomeRepository interface {

? ? Get(string) (*SomeModel, error)

}


type SomeRepository struct { ... }


func (r *SomeRepository) Get(id string) (*SomeModel, error) {

? ? // Handling a real repository access and returning your Object

}

當(dāng)你需要模擬它時(shí),只需創(chuàng)建一個(gè) Mock-Struct 并實(shí)現(xiàn)接口:


// repository_test.go


type SomeMockRepository struct { ... }


func (r *SomeRepository) Get(id string) (*SomeModel, error) {

? ? return &SomeModel{...}, nil

}


func TestSomething() {

? ? // You can use your mock as ISomeRepository

? ? var repo *ISomeRepository

? ? repo = &SomeMockRepository{}

? ? someModel, err := repo.Get("123")

}

這最好與某種依賴注入一起使用,因此將此存儲(chǔ)庫作為 ISomeRepository 傳遞到函數(shù)中。



查看完整回答
反對(duì) 回復(fù) 2023-06-26
?
胡說叔叔

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超8個(gè)贊

使用 Monkey 庫來掛鉤 mongo 驅(qū)動(dòng)程序中的任何函數(shù)。


例如:


func insert(collection *mongo.Collection) (int, error) {

    ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)


    u := User{

        Name: "kevin",

        Age:  20,

    }


    res, err := collection.InsertOne(ctx, u)

    if err != nil {

        log.Printf("error: %v", err)

        return 0, err

    }


    id := res.InsertedID.(int)

    return id, nil

}


func TestInsert(t *testing.T) {

    var c *mongo.Collection


    var guard *monkey.PatchGuard

    guard = monkey.PatchInstanceMethod(reflect.TypeOf(c), "InsertOne",

        func(c *mongo.Collection, ctx context.Context, document interface{}, opts ...*options.InsertOneOptions) (*mongo.InsertOneResult, error) {

            guard.Unpatch()

            defer guard.Restore()


            log.Printf("record: %+v, collection: %s, database: %s", document, c.Name(), c.Database().Name())

            res := &mongo.InsertOneResult{

                InsertedID: 100,

            }


            return res, nil

        })


    collection := client.Database("db").Collection("person")

    id, err := insert(collection)


    require.NoError(t, err)

    assert.Equal(t, id, 100)

}


查看完整回答
反對(duì) 回復(fù) 2023-06-26
  • 3 回答
  • 0 關(guān)注
  • 257 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)