Mock UpdateResult from UpdateOne using Go Mongo-Driver and mtest

王林
Release: 2024-02-09 20:00:33
forward
611 people have browsed it

使用 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")
    })
}
Copy after login

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.

Is 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},
        })
Copy after login
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!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!