Home >Backend Development >Golang >Mock UpdateResult from UpdateOne using Go Mongo-Driver and mtest

Mock UpdateResult from UpdateOne using Go Mongo-Driver and mtest

王林
王林forward
2024-02-09 20:00:33662browse

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

php editor Baicao will introduce in this article how to use Go Mongo-Driver and mtest to simulate UpdateResult from UpdateOne. Through this method, we can simulate the UpdateResult object in the test environment and perform various operations and verification on it. This technology helps developers better test and debug their code, ensuring its stability and reliability in production environments. This article will introduce in detail the steps and sample code for using Go Mongo-Driver and mtest to help readers get started quickly and apply it to actual projects. Let’s explore together!

Question content

I'm trying to use the mtest package (https://pkg.go.dev/go.mongodb.org/mongo-driver/mongo/integration /mtest) to perform some mock result testing on my mongodb calls, but I can't seem to figure out how to properly mock the *mongo.updateresult# returned when making an updateone(...) call to a collection. ## value.

Here is a code snippet demonstrating the problem:

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) The call works just fine. No errors are returned. Unfortunately, the updateresult.modifiedcount value is always 0.

I tried various combinations of

mtest.createsuccessresponse(...) and and bson.d, using nmodified and Names like n (as shown in the code snippet), as well as modifiedcount and matchedcountphp cnendcphpcn.cn nothing seems to fix the problem. 94b3e26ee717c64999d7867364b1b4a3 e388a4556c0f65e1904146cc1a846beeIs there a way to simulate this call so that it actually returns a value of modifiedcount<code>?

Solution

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

This worked for me to get modifiedcount: 1

The above is the detailed content of Mock UpdateResult from UpdateOne using Go Mongo-Driver and mtest. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete