【问题标题】:Pytest doesn't set attribute to mock objectPytest 没有将属性设置为模拟对象
【发布时间】:2014-04-21 09:37:14
【问题描述】:

这是一个测试用例代码:

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

正如我们所见,模拟对象没有调用适当的测试运行。所以我的问题 请问如何正确设置mock属性才能通过这个测试用例?

【问题讨论】:

    标签: python unit-testing mocking pytest


    【解决方案1】:

    看起来您正在修补错误的目标。试试这个:

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

    【讨论】:

    • 此更改没有帮助。
    猜你喜欢
    • 2014-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-10
    • 2020-05-19
    • 2013-09-04
    • 1970-01-01
    相关资源
    最近更新 更多