Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dependency_overrides does not override dependency [duplicate]

The following FastApi test should use my get_mock_db function instead of the get_db function, but it dosen't. Currently the test fails because it uses the real Database.

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,
        }
    ]

1 Answers

Key is to understand that dependency_overrides is just a dictionary. In order to override something, you need to specify a key that matches the original dependency.

def get_db():
   return {'db': RealDb()}

def home(commons: dict= Depends(get_db))
   commons['db'].doStuff()
 
app.dependency_overrides[get_db] = lambda: {'db': MockDb()}

Here you have inside the Depends function call a reference to get_db function. Then you are referring to the exact same function with dependency_overrides[get_db]. Therefore it gets overridden. Start by verifying that 'xxx' in these two match exactly: Depends(xxx) and dependency_overrides[xxx].

It took some time to wrap my head around the fact that whatever is inside the Depends call is actually the identifier for the dependency. So in this example the identifier is function get_db and the same function is used as key in the dictionary.

So this means the following example does not work since you are overriding something else than what's specified for 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()}

like image 128
Juha Palomäki Avatar answered Feb 19 '26 20:02

Juha Palomäki



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!