代码之家  ›  专栏  ›  技术社区  ›  Ivan

模拟没有按预期工作(Django)

  •  1
  • Ivan  · 技术社区  · 1 年前

    我有这个代码:

    // app1.service.py

    
    database = {
        1: "Alice",
        2: "Bob",
        3: "Charlie"
    }
    
    
    def get_user_from_db(user_id):
        return database.get(user_id)
    

    // app1.tests.test_service.py

    import pytest
    from unittest import mock
    
    from app1.service import get_user_from_db
    
    
    @mock.patch("app1.service.get_user_from_db")
    def test_get_user_from_db(mock_get_user_from_db):
        mock_get_user_from_db.return_value = "Mocked Alice"
        username = get_user_from_db(1)  # If I change it to mock_get_user_from_db(1) everything works fine
        assert username == "Mocked Alice"
    

    当我在命令行中运行“pytest”时,我会得到以下信息:

    E       AssertionError: assert 'Alice' == 'Mocked Alice'
    E         - Mocked Alice
    E         + Alice
    

    在我正在观看的教程中, get_user_from_db(1) 退货 “嘲笑爱丽丝”, 但在我的本地机器中,它只返回 “爱丽丝” 。我使用时效果很好

    username = mock_get_user_from_db(1)
    

    而不是

    username = get_user_from_db(1)
    

    问题:在我的情况下,username=get_user_from*db(1)返回“Alice”是预期行为吗? (在youtube视频中,它返回“嘲笑的爱丽丝”) 还是我只是做错了什么?

    1 回复  |  直到 1 年前
        1
  •  2
  •   willeM_ Van Onsem    1 年前

    你应该导入它 之后 嘲笑,否则它仍然指 老的 非模拟项目:

    from unittest import mock
    
    import pytest
    
    
    @mock.patch("app1.service.get_user_from_db")
    def test_get_user_from_db(mock_get_user_from_db):
        mock_get_user_from_db.return_value = 'Mocked Alice'
    
        from app1.service import get_user_from_db
    
        username = get_user_from_db(
            1
        )  # If I change it to mock_get_user_from_db(1) everything works fine
        assert username == "Mocked Alice"

    mocking工具不能改变原始对象的行为,所以基本上,它用一个行为不同的函数来代替它。