Как смоделировать значение переменной класса в модульном тесте Python? - PullRequest
2 голосов
/ 17 декабря 2011

Скажите, что у меня есть класс:

class A():
  def f(self):
    self._v = 1

Попытка:

m=Mocker()
A.f._v = m.mock()
...

, но не работает.Не уверен, как ...

Ответы [ 3 ]

4 голосов
/ 18 декабря 2011

Определение класса показывает переменную экземпляра, чтобы установить ее вне этого класса, сделать что-то вроде этого:

class A:
  def f(self):
    self._v = 1

a = A()
a._v = Mock()

Если вам действительно нужна переменная реального класса, попробуйте это:

class A():
  _v = None
  def f(self):
    self.__class__._v = 1

A._v = Mock()
4 голосов
/ 17 декабря 2011

Вы имели в виду Библиотека макетов ?

from mock import Mock
real = ProductionClass()
real.method = Mock(return_value=3)
real.method(3, 4, 5, key='value')

edit:

Вы пытаетесь получить доступ к Af_v до насмешки, что невозможно.Не уверен, что вы пытаетесь сделать, но это сработает

>>>A.f = Mock()
>>>a = A()
>>>a.f._v
<Mock name='mock._v' id='42076240'>
1 голос
/ 21 мая 2016

Я пробовал вышеупомянутые решения, и это все еще не решает мою цель, которая является точно тем, что спрашивают первоначально. Приведенный выше подход обновит атрибут mocked моего класса, чтобы он имел значение.

Мое требование состоит в том, чтобы установить значение атрибута из проверенного значения, которое я предоставляю в своем классе модульного теста.

Я мог бы наконец решить это с помощью следующего подхода. Дайте мне знать, если это не правильный путь:

Фактический класс:

class ActualClass(object):
    name=''

    def some_method(self):
        name=get_name_from_external_source()  #Say, returned name='ActualValue' 
        print name 

Класс модульных испытаний:

from mock import PropertyMock
import unittest
class TestActualClass(unittest.TestCase):
    def test_some_method(self):
        actual_class=ActualClass()
        p=PropertyMock(return_value='Mocked_Name')
        type(actual_class).name=p
        actual_class.some_method()

Когда вы запускаете some_method в ActualClass при обычном выполнении, вывод:

ActualValue

Когда вы запускаете TestActualClass, вывод:

Mocked_Name

Это подразумевает, что атрибуты класса макетируются с помощью фиктивного значения с помощью PropertyType, и вы можете протестировать метод с помощью фиктивного значения, не беспокоясь о вызове метода внешнего источника.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...