使用MongoDB进行集成测试 - 身份验证

1 投票
1 回答
566 浏览
提问于 2025-04-17 19:34

我有一个模块在使用mongodb,现在我正在为它写一个集成测试。我是根据这个例子来写的。

我遇到的错误是OperationFailure: command SON([('listDatabases', 1)]) failed: need to login,当我调用conn.database_names()的时候。

问题是我不太确定怎么登录。我尝试在subprocess.Popen中添加--username和--password参数,但没有成功。而且pymongo.Connection对象没有authenticate方法,虽然pymongo的数据库对象是有这个方法的。

有没有办法让我在从Popen启动mongo的时候进行认证,或者重新组织一下代码,让我可以访问到数据库对象呢?

class MongoTemporaryInstance(object):

    _instance = None

    @classmethod
    def get_instance(cls):
        if cls._instance is None:
            cls._instance = cls()
            atexit.register(cls._instance.shutdown)
        return cls._instance

    def __init__(self):
        self._tmpdir = tempfile.mkdtemp()
        self._process = subprocess.Popen(['mongod', '--bind_ip', 'localhost',
                                      '--port', str(MONGODB_TEST_PORT),
                                      '--dbpath', self._tmpdir,
                                      '--nojournal', '--nohttpinterface',
                                      '--noauth', '--smallfiles',
                                      '--syncdelay', '0',
                                      '--maxConns', '10',
                                      '--nssize', '1', ],
                                         stdout=open(os.devnull, 'wb'),
                                         stderr=subprocess.STDOUT)

        for i in range(3):
            time.sleep(0.1)
            try:
                self._conn = pymongo.Connection('localhost', MONGODB_TEST_PORT)
            except pymongo.errors.ConnectionFailure:
                continue
            else:
                break

1 个回答

0

问题就像@RobMoore说的那样——在那个端口上有一个旧的mongodb进程在运行,并且它使用了身份验证。我换了一个端口,结果就好了!

撰写回答