【问题标题】:How to connect to mongodb using FluentDocker如何使用 FluentDocker 连接到 mongodb
【发布时间】:2021-11-29 03:48:12
【问题描述】:

我正在尝试使用 FluentDocker 对 MongoDB 运行测试,但我无法连接到它,请参阅下面的代码。

            [Fact]
            public async Task TestMongoDbConnection3()
            {
                const string root = "root";
                const string secret = "secret";
                
                using (
                    var container =
                        new Builder().UseContainer()
                            .UseImage("mongo")
                            .WithEnvironment($"MONGO_INITDB_ROOT_USERNAME:{root}")
                            .WithEnvironment($"MONGO_INITDB_ROOT_PASSWORD:{secret}")
                            .ExposePort(27018)
                            .WaitForPort("27018/tcp", 30000 /*30s*/)
                        .Build()
                        .Start())
            {
                var config = container.GetConfiguration(true);
                Assert.Equal(ServiceRunningState.Running, config.State.ToServiceState());
                
                const string connectionString = "mongodb://root:secret@localhost:27018";

                // insert data 
                const string collectionName = "Users";
                
                var mongoClient = new MongoClient(connectionString);
                var database = mongoClient.GetDatabase ("Users");
                var collection = database.GetCollection<User>(collectionName);
                
                const int id = 1;
                var data = new Fixture().Build<User>()
                    .With(x => x.Id, id)
                    .Create();

                // delete if exists, but got timeout after 30000 ms
                await collection.DeleteOneAsync(x => x.Id == data.Id);
                
                ...
            }
        }

我尝试从配置 (config.NetworkSettings.IPAddress) 中替换 IP 的本地主机,但仍然超时。

有什么想法吗?

非常感谢,

【问题讨论】:

    标签: c# mongodb unit-testing .net-core fluent-docker


    【解决方案1】:

    这里是修复 var ep = container.ToHostExposedEndpoint("27017/tcp"); 在我的 macos 上本地运行时有效。

    这里是完整的代码。在 docker-in-docker 映像上运行时它仍然会下降(超时)。

    [Fact]
    public void Test_Run_PingCommand_returns_True()
    {
        const string root = "root";
        const string secret = "secret";
    
        using (
            var container =
                new Builder().UseContainer()
                    .UseImage("mongo")
                    .WithEnvironment(new []{$"MONGO_INITDB_ROOT_USERNAME={root}",
                        $"MONGO_INITDB_ROOT_PASSWORD={secret}"})
                    .ExposePort(27017)
                    .WaitForPort("27017/tcp", 30000 /*30s*/)
                    .Build()
                    .Start())
        {
            var config = container.GetConfiguration(true);
            Assert.Equal(ServiceRunningState.Running, config.State.ToServiceState());
           
            var ep = container.ToHostExposedEndpoint("27017/tcp");
           
            var connectionString =
                $"mongodb://{root}:{secret}@{ep}";
           
            var setting = new UsageDbSettings();
            var mongoClient = new MongoClient(connectionString);
            var database = mongoClient.GetDatabase(setting.DatabaseName);
            
            var isMongoLive = database.RunCommandAsync((Command<BsonDocument>)"{ping:1}").Wait(30000);
           
            Assert.True(isMongoLive);
        }
    }
    
    

    【讨论】:

    • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
    猜你喜欢
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2017-09-09
    • 1970-01-01
    • 2019-12-10
    • 2017-05-24
    • 1970-01-01
    • 2019-10-15
    相关资源
    最近更新 更多