首頁 >後端開發 >Golang >使用 Go Mongo-Driver 和 mtest 從 UpdateOne 模擬 UpdateResult

使用 Go Mongo-Driver 和 mtest 從 UpdateOne 模擬 UpdateResult

王林
王林轉載
2024-02-09 20:00:33662瀏覽

使用 Go Mongo-Driver 和 mtest 从 UpdateOne 模拟 UpdateResult

php小編百草在這篇文章中將介紹如何使用Go Mongo-Driver和mtest從UpdateOne模擬UpdateResult。透過這種方法,我們可以在測試環境中模擬UpdateResult對象,並對其進行各種操作和驗證。這種技術可以幫助開發人員更好地測試和調試他們的程式碼,確保其在生產環境中的穩定性和可靠性。本文將詳細介紹使用Go Mongo-Driver和mtest的步驟和範例程式碼,幫助讀者快速上手並應用於實際專案中。讓我們一起來探索吧!

問題內容

我正在嘗試使用mtest 套件(https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo/integration /mtest)對我的mongodb 呼叫執行一些模擬結果測試,但我似乎無法弄清楚如何正確模擬對集合進行updateone(...) 呼叫時返回的*mongo.updateresult 值。

這是示範該問題的程式碼片段:

package test

import (
    "context"
    "errors"
    "testing"

    "github.com/stretchr/testify/assert"
    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/integration/mtest"
)

func UpdateOneCall(mongoClient *mongo.Client) error {
    filter := bson.D{{Key: "SomeIDField", Value: "SomeID"}}
    update := bson.D{{Key: "$set", Value: bson.D{{Key: "ANewField", Value: true}}}}
    collection := mongoClient.Database("SomeDatabase").Collection("SomeCollection")
    updateResult, err := collection.UpdateOne(context.Background(), filter, update)
    if err != nil {
        return err
    }
    if updateResult.ModifiedCount != 1 {
        return errors.New("no field was updated")
    }
    return nil
}

func TestUpdateOneCall(t *testing.T) {
    mt := mtest.New(t, mtest.NewOptions().ClientType(mtest.Mock))
    defer mt.Close()

    mt.Run("Successful Update", func(mt *mtest.T) {

        mt.AddMockResponses(mtest.CreateSuccessResponse(
            bson.E{Key: "NModified", Value: 1},
            bson.E{Key: "N", Value: 1},
        ))

        err := UpdateOneCall(mt.Client)

        assert.Nil(t, err, "Should have successfully triggered update")
    })
}

collection.updateone(context.background(), filter, update) 呼叫運作得很好。沒有回傳任何錯誤。不幸的是,updateresult.modifiedcount 值始終為 0。

我嘗試了mtest.createsuccessresponse(...) 和 和bson.d 的多種組合,使用nmodified n(如程式碼片段所示)等名稱,以及modifiedcount matchedcountphp cnendcphpcn.cn似乎沒有什麼可以解決問題。 94b3e26ee717c64999d7867364b1b4a3 e388a4556c0f65e1904146cc1a846bee是否有辦法模擬此調用,使其實際上返回 <code>modifiedcount 的值?

解決方法

mt.AddMockResponses(bson.D{
            {"ok", 1},
            {"nModified", 1},
        })

這對我獲得 modifiedcount 有用:1

以上是使用 Go Mongo-Driver 和 mtest 從 UpdateOne 模擬 UpdateResult的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除