Я думаю, это потому, что мои модели и их атрибуты уже импортированы и оценены перед выполнением моего теста, поэтому макет здесь бесполезен.
blockquote>Close: вы передали ссылку на функцию
get_uuid()
по умолчанию наid
, а результат вызоваget_now()
(объекта выражения функции) по умолчанию наcreated_at
. Изменение того, с чем связаны эти имена в модуле после факта, больше не влияет на столбцы, которые уже содержат ссылки на сами объекты.В случае
get_uuid()
вы должны смоделировать вызываемую им функцию:mock = mocker.MagicMock(return_value='123e4567-e89b-12d3-a456-426655440000') mocker.patch('uuid.uuid4', mock)
, а в случае
get_now()
вы должны не вызывать ее во время построения модели:class BaseModel(db.Model): ... created_at = db.Column(..., default=get_now, ...)
, чтобы вы снова могли смоделировать фактическую функцию, которую она вызывает:
mock = mocker.MagicMock(return_value=datetime.datetime(2019, 1, 1)) mocker.patch('sqlalchemy.func.now', mock)
С другой стороны, возможно, вам не следует ничего утверждать о
id
и временных метках в тесте, так как кажется, что важно убедиться, что имя было установлено правильно.
Я знаю, что это - старый вопрос, но я не вижу правильный ответ, таким образом, я отвечаю так или иначе.
Статический импорт
Основной импорт работает хорошо на программы с относительно немногими модулями и импортом. Если существует большой импорт, коллизии имени могут начать происходить между именами в различных импортированных модулях. Один способ остановить это при помощи статического импорта. Статический импорт требует, чтобы использовал полностью определенное имя для ссылки на имена модуля:
static import std.stdio; void main() { writefln("hello!"); // error, writefln is undefined std.stdio.writefln("hello!"); // ok, writefln is fully qualified }
Как указано выше, D модули намного больше, чем пространства имен C++. D является МОДУЛЬНЫМ языком также. Модули в D имеют конструкторов/деструкторы. Кроме того, D имеет пакеты. Читайте больше о модулях и пакетах в D здесь: http://www.digitalmars.com/d/2.0/module.html.
Вот самая интересная часть того, что говорит та страница:
Модули имеют взаимно-однозначное соответствие с исходными файлами. Имя модуля является именем файла с путем и неизолированным расширением.
Модули автоматически обеспечивают объем пространства имен для своего содержания. Модули поверхностно напоминают классы, но отличаются по этому:
- Существует только один экземпляр каждого модуля, и он статически выделяется.
- Нет никакой виртуальной таблицы.
- Модули не наследовались, у них нет супер модулей и т.д.
- Только один модуль на файл.
- Символы модуля могут быть импортированы.
- Модули всегда компилируются в глобальной области видимости и незатронуты путем окружения атрибутов или других модификаторов.
Модули могут группироваться в иерархиях, названных пакетами.
Модули предлагают несколько гарантий: - порядок, в котором импортируются модули, не влияет на семантику. - Семантика модуля не затронута тем, что импортирует ее. - Если модуль C импортирует модули A и B, любые модификации к B тихо не изменят код в C, который зависит от A.
Необходимо использовать часть импорта. Однако возможно обратиться к method/function/whatever со всем путем модуля перед ним. Например, std.stdio.writefln ("... ") был бы допустим, если Вы импортируете std.stdio (и используете Phobos). Это может быть полезно, если у Вас есть более затем одна функция, которая вызвана "writefln".
Я не думаю, что можно сделать это. import
оператор в D делает больше, чем using namespace
оператор делает в C++. Это также заменяет #include
директива препроцессору.