**(CompileError)test / integration / listing_authors.test.exs:9:BookcaseApi.Author .__ struct __ / 1

时间:2017-06-04 00:20:00

标签: elixir phoenix-framework

我正在进行集成测试,但现在它无法编译。

listing_authors.test.exs

defmodule ListingAuthorsIntegrationTest do
  use ExUnit.Case, async: true
  use Plug.Test
  alias BookcaseApi.Web.Router
  alias BookcaseApi.Author

  @opts Router.init([])
  test 'listing authors' do
    author = %Author{name: "Oscar Wilde"}
             |> Repo.insert!

    # Note: single quotes are for char lists.
    # Note: double quotes are for strings.
    conn = conn(:get, "/authors")
    response = Router.call(conn, @opts)

    assert response.status == 200
    assert response.resp_body == author
  end
end

author.ex

defmodule BookcaseApi.Author do
  use BookcaseApi.Web, :model

  schema "name" do

    timestamps()
  end

  @doc """
  Builds a changeset based on the `struct` and `params`.
  """
  def changeset(struct, params \\ %{}) do
    struct
    |> cast(params, [])
    |> validate_required([])
  end
end

stacktrace.txt

λ mix test test/integration/listing_authors.test.exs                             0 < 18:39:12
** (CompileError) test/integration/listing_authors.test.exs:9: BookcaseApi.Author.__struct__/1 is undefined, cannot expand struct BookcaseApi.Author
    (stdlib) lists.erl:1354: :lists.mapfoldl/3
    test/integration/listing_authors.test.exs:8: (module)
(stdlib) erl_eval.erl:670: :erl_eval.do_apply/6

有关如何进行编译的集成测试的任何帮助都很棒。

2017年6月4日更新 这是一个使用以下命令

生成的phoenix v1.3 rc2项目
mix phx.new bookcase_api --no-html --no-brunch

然后,我使用以下命令

为项目生成了一个模型
mix phoenix.gen.json Author name

2 个答案:

答案 0 :(得分:2)

我猜测你的问题是在使用Phoenix 1.3项目的mix phoenix.gen.json(这是Phoenix 1.2生成器)。请尝试使用mix phx.gen.json。您的模型正在尝试use BookcaseApi.Web, :model,而Phoenix 1.3方案应该use Ecto.Schema

答案 1 :(得分:1)

Dennis已经指出你已经为应用程序和模型使用了两个不同的生成器,所以这肯定是你问题的根源。生成的模型还存在另一个问题。看起来您打算使用单个Author字段生成name模式,但看起来您没有为它传递数据库表的名称,因此它将name解释为表名。使用新生成器,您还需要为其提供一个上下文 - 在这种情况下,您可能希望使用作者,以防您想要添加与您的作者api相关的更多模块。所以你的发电机命令是:

mix phx.gen.json Authors Author authors name:string

(:字符串在技术上可以保持关闭,生成器假设您希望字段为:字符串时间,除非另有说明)

正确生成的结构如下所示:

defmodule BookcaseApi.Authors.Author do
  use Ecto.Schema

  schema "authors" do
    field :name, :string
    timestamps
  end
end

Phoenix网站的文档尚未更新,以涵盖新的生成器,但源文件已有详细记录。以下是新json生成器的文档(也可通过mix help phx.gen.json访问):https://github.com/phoenixframework/phoenix/blob/master/lib/mix/tasks/phx.gen.json.ex