2016-12-03 3 views
3

Я строю свой первый тест на феникс. Я просто пытаюсь утверждать, что на экране есть контент. Я использую ex_machina для завода, это может быть моя проблема, но я не уверен? Вот мой код.Набор тестов Phoenix не может найти столбец при запуске теста

Таблица:

create table(:locations) do 
    add :start, :string 
    add :finish, :string 
end 

Тест:

Контроллер:

def show(conn, %{"id" => locations_id}) do 
    locations = Repo.get!(Locations, locations_id) 

    render conn, "show.html", locations: locations 
end 

Ошибка:

** (Postgrex.Error) ERROR (undefined_column): column "finish" of relation "locations" does not exist 
stacktrace: 
    (ecto) lib/ecto/adapters/sql.ex:463: Ecto.Adapters.SQL.struct/6 
    (ecto) lib/ecto/repo/schema.ex:397: Ecto.Repo.Schema.apply/4 
    (ecto) lib/ecto/repo/schema.ex:193: anonymous fn/11 in Ecto.Repo.Schema.do_insert/4 
    (ecto) lib/ecto/repo/schema.ex:124: Ecto.Repo.Schema.insert!/4 
    test/controllers/locations_controller_test.exs:8: (test) 
+0

Вы можете попробовать обновить базу данных для тестовой среды. Затем перепроверьте, существует ли столбец базы данных таблицы 'locations'' finish'. –

+0

Как восстановить db? – Bitwise

+0

'MIX_ENV = тестовый микс ecto.drop' ИЛИ' psql -U postgres -c "DROP DATABASE awesome_lunch_test;" '. Во втором подходе вы можете иметь другое имя пользователя базы данных и имя базы данных (тестовые конфиги хранятся в 'config/test.exs'). Затем просто запускайте тесты - база данных будет создана до запуска тестов. –

ответ

5

Запуск mix test выполняется миграция.

Вот, возможно, что случилось:

  1. Вы создали файл миграции с mix ecto.gen.migration.
  2. Вы запустили mix test. На этом этапе была проведена вся миграция, в том числе ваша вновь созданная. Эта новая миграция была установлена ​​как запущенная в таблице schema_migrations вашего тестового db.
  3. Вы редактировали миграцию с инструкцией по добавлению таблицы.
  4. Вы снова запустили mix test: в этот момент микс не видел новой миграции для запуска, так как новая была уже установлена ​​как запущенная. Ваша новая колонка никогда не добавлялась.

Если это ваш случай, просто запустите MIX_ENV=test mix ecto.reset, и все миграции будут повторно запущены. (данные также будут потеряны, что не должно быть проблемой для теста db).

===

Подсказка: вы можете понять, почему миграции управляют, глядя на ваш mix.exs файл в частной функции aliases:

defp aliases do 
    [... 
    "test": ["ecto.create --quiet", "ecto.migrate", "test"]] 
    end 
Смежные вопросы