Как я использую весь путь пространства имен к функции в D

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

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 и временных метках в тесте, так как кажется, что важно убедиться, что имя было установлено правильно.

5
задан sigod 9 March 2016 в 17:53
поделиться

4 ответа

Я знаю, что это - старый вопрос, но я не вижу правильный ответ, таким образом, я отвечаю так или иначе.

Статический импорт

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

static import std.stdio;

void main()
{
    writefln("hello!");            // error, writefln is undefined
    std.stdio.writefln("hello!");  // ok, writefln is fully qualified
}

Источник

8
ответ дан 18 December 2019 в 07:32
поделиться

Как указано выше, D модули намного больше, чем пространства имен C++. D является МОДУЛЬНЫМ языком также. Модули в D имеют конструкторов/деструкторы. Кроме того, D имеет пакеты. Читайте больше о модулях и пакетах в D здесь: http://www.digitalmars.com/d/2.0/module.html.

Вот самая интересная часть того, что говорит та страница:

Модули имеют взаимно-однозначное соответствие с исходными файлами. Имя модуля является именем файла с путем и неизолированным расширением.

Модули автоматически обеспечивают объем пространства имен для своего содержания. Модули поверхностно напоминают классы, но отличаются по этому:

  • Существует только один экземпляр каждого модуля, и он статически выделяется.
  • Нет никакой виртуальной таблицы.
  • Модули не наследовались, у них нет супер модулей и т.д.
  • Только один модуль на файл.
  • Символы модуля могут быть импортированы.
  • Модули всегда компилируются в глобальной области видимости и незатронуты путем окружения атрибутов или других модификаторов.

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

Модули предлагают несколько гарантий: - порядок, в котором импортируются модули, не влияет на семантику. - Семантика модуля не затронута тем, что импортирует ее. - Если модуль C импортирует модули A и B, любые модификации к B тихо не изменят код в C, который зависит от A.

6
ответ дан 18 December 2019 в 07:32
поделиться

Необходимо использовать часть импорта. Однако возможно обратиться к method/function/whatever со всем путем модуля перед ним. Например, std.stdio.writefln ("... ") был бы допустим, если Вы импортируете std.stdio (и используете Phobos). Это может быть полезно, если у Вас есть более затем одна функция, которая вызвана "writefln".

5
ответ дан 18 December 2019 в 07:32
поделиться

Я не думаю, что можно сделать это. import оператор в D делает больше, чем using namespace оператор делает в C++. Это также заменяет #include директива препроцессору.

2
ответ дан 18 December 2019 в 07:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: