dependency_overrides 不覆盖依赖
dependency_overrides does not override dependency
下面的 FastApi 测试应该使用我的 get_mock_db
函数而不是 get_db
函数,但它没有。目前测试失败,因为它使用了真实的数据库。
def get_mock_db():
example_todo = Todo(title="test title", done=True, id=1)
class MockDb:
def query(self, _model):
mock = Mock()
mock.get = lambda _param: example_todo
def all(self):
return [example_todo]
def add(self):
pass
def commit(self):
pass
def refresh(self, todo: CreateTodo):
return Todo(title=todo.title, done=todo.done, id=1)
return MockDb()
client = TestClient(app)
app.dependency_overrides[get_db] = get_mock_db
def test_get_all():
response = client.get("/api/v1/todo")
assert response.status_code == 200
assert response.json() == [
{
"title": "test title",
"done": True,
"id": 1,
}
]
关键是要明白 dependency_overrides 只是一本字典。为了覆盖某些东西,您需要指定一个与原始依赖项匹配的键。
def get_db():
return {'db': RealDb()}
def home(commons: dict= Depends(get_db))
commons['db'].doStuff()
app.dependency_overrides[get_db] = lambda: {'db': MockDb()}
在这里,您在 Depends
函数中调用了对 get_db
函数的引用。那么您指的是与 dependency_overrides[get_db]
完全相同的函数。因此它被覆盖了。首先验证这两个中的 'xxx' 是否完全匹配:Depends(xxx) 和 dependency_overrides[xxx].
我花了一些时间来理解 Depends
调用中的任何内容实际上都是依赖项的标识符这一事实。所以在这个例子中标识符是函数 get_db 并且相同的函数被用作字典中的键。
所以这意味着下面的示例不工作,因为您正在覆盖为 Depends 指定的其他内容。
def get_db(connection_string):
return {'db': RealDb(connection_string)}
def home(commons: dict= Depends(get_db(os.environ['connectionString']))
commons['db'].doStuff()
# Does not work
app.dependency_overrides[get_db] = lambda: {'db': MockDb()}
下面的 FastApi 测试应该使用我的 get_mock_db
函数而不是 get_db
函数,但它没有。目前测试失败,因为它使用了真实的数据库。
def get_mock_db():
example_todo = Todo(title="test title", done=True, id=1)
class MockDb:
def query(self, _model):
mock = Mock()
mock.get = lambda _param: example_todo
def all(self):
return [example_todo]
def add(self):
pass
def commit(self):
pass
def refresh(self, todo: CreateTodo):
return Todo(title=todo.title, done=todo.done, id=1)
return MockDb()
client = TestClient(app)
app.dependency_overrides[get_db] = get_mock_db
def test_get_all():
response = client.get("/api/v1/todo")
assert response.status_code == 200
assert response.json() == [
{
"title": "test title",
"done": True,
"id": 1,
}
]
关键是要明白 dependency_overrides 只是一本字典。为了覆盖某些东西,您需要指定一个与原始依赖项匹配的键。
def get_db():
return {'db': RealDb()}
def home(commons: dict= Depends(get_db))
commons['db'].doStuff()
app.dependency_overrides[get_db] = lambda: {'db': MockDb()}
在这里,您在 Depends
函数中调用了对 get_db
函数的引用。那么您指的是与 dependency_overrides[get_db]
完全相同的函数。因此它被覆盖了。首先验证这两个中的 'xxx' 是否完全匹配:Depends(xxx) 和 dependency_overrides[xxx].
我花了一些时间来理解 Depends
调用中的任何内容实际上都是依赖项的标识符这一事实。所以在这个例子中标识符是函数 get_db 并且相同的函数被用作字典中的键。
所以这意味着下面的示例不工作,因为您正在覆盖为 Depends 指定的其他内容。
def get_db(connection_string):
return {'db': RealDb(connection_string)}
def home(commons: dict= Depends(get_db(os.environ['connectionString']))
commons['db'].doStuff()
# Does not work
app.dependency_overrides[get_db] = lambda: {'db': MockDb()}