Как издеваться над классом в Python? - PullRequest
1 голос
/ 11 апреля 2011

Я новичок в Python, но раньше работал с ruby.

Я пытаюсь провести некоторые тесты с Python, но не могу понять, как я смоделирую класс для своего теста.

Допустим, у меня есть настоящий класс:

from database import DB
class Foo:
  def do_it(self):
    x = {'key': 'value'}
    DB.save(x)
    # do other stuff with x
    return x

Теперь я хочу проверить, возвращает ли все, что я делаю с x, правильный результат, и я хочу проверить, был ли вызван DB.save с параметром x, но я не хочу на самом деле сохранять x база данных. Чтобы увидеть, вызывается ли DB.save, я могу использовать некоторую фиктивную среду, но как я могу сказать классу Foo, что он мне нужен для использования фиктивного объекта, а не реального объекта БД?

Спасибо.

EDIT: Извините, моего примера недостаточно для того, что мне нужно сделать.

Давайте посмотрим на этот новый пример:

from database import DB
class Foo:
  DB.connect()
  def do_it(self):
    x = {'key': 'value'}
    DB.save(x)
    # do other stuff with x
    return x

Например, предположим, что база данных не работает.

Когда я импортирую Foo, это вызывает ошибку соединения, и у меня нет времени, чтобы имитировать БД.

Что мне делать ??

Ответы [ 2 ]

7 голосов
/ 11 апреля 2011

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

class Foo(object):
    def __init__(self, *args, **kwargs):
        DB.connect()
4 голосов
/ 11 апреля 2011

DB будет просматриваться в области видимости модуля каждый раз, когда вызывается Foo.do_it(). Вы можете просто назначить другой объект DB, и он будет использован. Если ваш класс Foo находится в каком-то модуле foo, вы можете сделать что-то вроде

import foo
foo.DB = mocked_DB
f = foo.Foo()
f.do_it()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...