Pytest未能设置mock对象属性

0 投票
1 回答
1216 浏览
提问于 2025-04-18 03:34

这里有一段测试用例的代码:

def test_interactive_session_set_language(monkeypatch):
    """Test user possibility to select language."""

    events = [':ru-en', EOFError]

    mock_input = mock.Mock(side_effect=events)

    mock_set_language = mock.Mock()

    monkeypatch.setattr('builtins.input', mock_input)
    monkeypatch.setattr('pylingvo.interactive.pylingvo.client.set_language',
                        mock_set_language)

    with pytest.raises(SystemExit):

        pylingvo.interactive.start_session()

    assert mock_set_language.call_count == 1

这里有一个模块的代码:

import pylingvo.client
import sys
import re


def start_session():
    """Start interactive session."""

    while True:

        try:

            line = input('> ')

        except (EOFError, KeyboardInterrupt):

            sys.exit()

        else:

            command = dispatch(line)


COMMAND_MATCH_PATTERNS = [
    ('^:[a-z]{2}-[a-z]{2}$', pylingvo.client.set_language),
    ('^.*$', Exception),
]


COMMAND_MATCH_TABLE = [(re.compile(regex), command)
                       for regex, command in COMMAND_MATCH_PATTERNS]


def dispatch(command_name):
    """Convert interactive input to callable object."""

    for pattern, command in COMMAND_MATCH_TABLE:

        if pattern.match(command_name):

            return command

这个测试用例失败了,错误信息是:

E       assert 0 == 1
E        +  where 0 = <Mock id='139806765631632'>.call_count

从中我们可以看到,模拟对象没有被调用,因为测试没有成功运行。那么我的问题是,应该如何正确设置模拟属性,这样这个测试用例才能通过呢?

1 个回答

-1

看起来你可能在修补错误的目标。试试这个:

monkeypatch.setattr('pylingvo.client.set_language', mock_set_language)

撰写回答