我有一个由一个随机失败的1节点MongoDB支持的烧瓶积分测试:

pytest/test_webapi.py:59: in test_register_test
>           assert res.status_code == 302
E           assert <Response streamed [404 NOT FOUND]>.status_code == 302
.

失败率大约为50%。

在test_webapi.py中测试因此:

def test_register_user(self):
    res = self.client.get("/logout")

    class MySMTPServer(smtpd.SMTPServer):
        mails = []
        def process_message(self, peer, mailfrom, rcpttos, data):
            self.mails.append((rcpttos[0], data))

    server = MySMTPServer(('localhost', 12345), None)

    t = threading.Thread(target=asyncore.loop, args=(1,))
    t.start()
    time.sleep(.1)

    try:
        res = self.client.post("/register", data=self.registration)
        assert res.status_code == 200

        mail, hash = server.mails[0]

        self.conn.fsync()
        time.sleep(.1)

        res = self.client.get('/activate/' + hash)
        assert res.status_code == 302
    finally:
        server.close()
.

来自webapi.py的相关烧瓶方法:

@app.route("/register", methods=["POST"])
def register_user():
    mail = flask.request.form['mail']
    user = flask.request.form["user"]
    pw = flask.request.form["pass"]

    hash = users.register(user, pw, mail=mail)
    return flask.jsonify({'_id': None}) # XXX

@app.route('/activate/<hash>', methods=['GET'])
def activate_user(hash):
    key = users.activate(hash=hash)
    if not key:
        flask.abort(404)
    return flask.redirect("/")
.

...按操作方法支持:

make_key = lambda : base64.encodestring(os.urandom(32)).strip()

def register(self, user, pw, **kw):
    hash = self.make_key()
    user = self.new(user, pw, activation=hash, **kw)
    self._send_mail(**user)
    return hash

def activate(self, hash):
    user = self.users.find_one({'activation': hash})
    if not user:
        return None
    key = self.make_key()
    activation = {
        '$unset': {'activation': 1},
        '$set': {'status': 'active', 'key': key} }
    self.users.update({'_id': user['_id']}, activation)
    return user
.

...在哪里self.users是MongoDB系列。

self.new()使用safe= true持久。

有趣的是,其他几个测试类似的东西似乎从未遇到过这个问题。

我认为这足以确保Pymongo连接池中的其他线程可以看到持久对象。我应该更仔细阅读mongodb / pymongo文件的哪一部分?或者与异步有一些奇怪的互动?

有帮助吗?

解决方案

(从注释线程移植)

在测试的上下文中,是生成的iconicetagcode值只是基本的64编码字符串的激活密钥?base64包含字母和数字,但也是“+”和“/”,两者都将被URL解析器(特别是“/”)误解的误解

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top