Как я блокирую/дразню вызов к командной строке с rspec?

Используя choices параметр не будет использовать ПЕРЕЧИСЛИМЫЙ тип дб; это просто создаст VARCHAR или ЦЕЛОЕ ЧИСЛО, в зависимости от того, используете ли Вы choices с CharField или IntegerField. Обычно это очень хорошо. Если для Вас важно, чтобы ПЕРЕЧИСЛИМЫЙ тип использовался на уровне базы данных, у Вас есть три опции:

  1. Использование "./manage.py sql appname" для наблюдения SQL, который Django генерирует, вручную измените его, чтобы использовать ПЕРЕЧИСЛИМЫЙ тип и выполнить его сами. Если Вы составите таблицу вручную сначала, то "./manage.py syncdb" не смешает с нею.
  2. , Если Вы не хотите делать это вручную каждый раз, Вы генерируете свой DB, помещаете некоторый пользовательский SQL в appname/sql/modelname.sql для выполнения соответствующей команды ALTER TABLE.
  3. Создают пользовательский тип поля и определяют db_type метод соответственно.

С любой из этих опций, это была бы Ваша обязанность иметь дело с последствиями для мобильности перекрестной базы данных. В опции 2 Вы могли использовать database-backend-specific пользовательский SQL, чтобы гарантировать, что Ваш ALTER TABLE только выполняется на MySQL. В опции 3 Ваш db_type метод должен был бы проверить механизм базы данных и установить тип столбца дб на тип, который на самом деле существует в той базе данных.

ОБНОВЛЕНИЕ : Так как платформа миграций была добавлена в Django 1.7, опции 1 и 2 выше являются совершенно устаревшими. Опция 3 всегда была наилучшим вариантом так или иначе. Новая версия опций 1/2 включила бы сложную пользовательскую миграцию с помощью SeparateDatabaseAndState - но действительно Вы хотите опцию 3.

6
задан caf 11 November 2009 в 00:09
поделиться

1 ответ

Вот небольшой пример, который я сделал. Я звоню LS из своего класса-манекена. Протестировано с помощью rspec

require "rubygems"
require "spec"

class Dummy
  def command_line
    system("ls")
  end
end

describe Dummy do
  it  "command_line should call ls" do
    d = Dummy.new
    d.should_receive("system").with("ls")
    d.command_line
  end
end
6
ответ дан 8 December 2019 в 17:23
поделиться
Другие вопросы по тегам:

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