Nano Hash - криптовалюты, майнинг, программирование

Как ссылаться на внешние контексты в тестовых файлах?

Я действительно изо всех сил пытаюсь понять контексты в Phoenix Elixir. У меня есть три контекста: Auth (содержит User.ex), Groups (Circle.ex) и Content (ShareMark.ex). Внутри каждой из них есть схемы users, circles и sharemarks соответственно.

Я пытаюсь понять, как использовать предварительно предоставленный create_circle вне контекста Groups. Есть ли что-то похожее на контекст в Ruby?

В content_test.ex я пытаюсь определить следующее

@valid_attrs %{circle: Groups.create_circle(%{name: "My test"}), url: "google.com", title: "Google"}

defmodule ShareMark.ContentTest do
  use ShareMark.DataCase

  alias ShareMark.Content
  use ShareMark.Groups
  describe "sharemarks" do
    alias ShareMark.Content.ShareMark
    @valid_attrs %{circle: Groups.create_circle(%{name: "Evan's test"}), url: "google.com", title: "Google"}
    @update_attrs %{circle: Groups.create_circle(%{name: "Mike's test"}), url: "duckduckgo.com", title: "DuckDuckGo"}
    @invalid_attrs %{circle: Groups.create_circle(%{name: "Bad test"})}

    def sharemark_fixture(attrs \\ %{}) do
      {:ok, sharemark} =
        attrs
        |> Enum.into(@valid_attrs)
        |> Content.create_sharemark()

      sharemark
    end
 ...
end

Вот circle.ex

defmodule ShareMark.Groups.Circle do
  use Ecto.Schema
  import Ecto.Changeset

  schema "circles" do
    field :name, :string
    field :creator_id, :id
    many_to_many :members, ShareMark.Auth.User, join_through: "users_circles"
    has_many :sharemarks, ShareMark.Content.ShareMark

    timestamps()
  end

  @doc false
  def changeset(circle, attrs) do
    circle
    |> cast(attrs, [:name])
    |> validate_required([:name])
  end
end

Но выдает следующую ошибку:

** (CompileError) test/sharemark/content/content_test.exs:8: undefined function create_circle/1

Google совершенно бесполезен, так как у Феникса так мало вопросов по этому поводу. Извините за такой вопрос новичка.


  • Случайно ли метод Groups.create_circle взаимодействует с базой данных? 13.11.2018
  • Он делает это делает. Он создает круг и добавляет его в БД. |> Repo.insert() 13.11.2018

Ответы:


1

В вашем тесте у вас есть эта строка:

use ShareMark.Groups

это должен быть оператор alias:

alias ShareMark.Groups
13.11.2018

2

Во-первых, phoenix-framework не заставляют вас использовать контексты, они просто способ лучше организовать ваш код. Это делает их немного более запутанными для начинающих по сравнению со структурой File-Type First (FTF) в rails приложения, но делает иерархию кода намного более простой для понимания и управления в долгосрочной перспективе.

Вы можете использовать контексты или просто собрать все модули вместе. В любом случае, любые общедоступные функции, которые вы определяете, доступны из любого места в приложении (при условии, что вы используете правильное имя модуля для позвонить им).

Дополнительные ресурсы по контекстам:


Теперь перейдем к вашему фактическому коду. В нем есть две проблемы.

Во-первых, как упомянул @Paweł, вам нужно alias указать свой модуль или использовать полное имя:

alias ShareMark.Groups

Во-вторых, вы вызываете Groups.create_circle в атрибуте модуля. (@value). Атрибуты модуля не похожи на ваши обычные «переменные», они разрешаются в время компиляции. Это означает, что в вашем случае они попытаются записать в базу данных еще до того, как вы запустите свой набор тестов.

Чтобы исправить это, либо переместите логику инициализации в реальный тест, либо в setup/1< ExUnit. /a> обратный вызов:

setup do
  %{circle: Groups.create_circle(%{name: "Test Circle"}}
end

test "something", %{circle: circle} do
  valid_attrs = %{circle: circle, url: "google.com", title: "Google"}
  # assert something
end
13.11.2018
  • Замечательно. Ответы, подобные этим, объясняют, почему Stack Overflow так хорош. Вы дали мне ответ на мой вопрос и больше полезных ресурсов, чтобы мне не приходилось возвращаться снова. Спасибо! 14.11.2018
  • Подумайте о том, чтобы принять ответ, если он решил вашу проблему. 14.11.2018
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..