2017-09-25 10 views
0

私は現在、create_zone関数を使用するコントローラをテストしています。この関数は、ユーザーを取得してそのユーザーをゾーンに関連付け、次に両方の関連テーブルのみの参加者エントリを作成する関数エントリ。Phoenix Elixir:内部関数を模擬する

def create_zone(attrs \\ %{}, user_id) do 
    user = Accounts.get_user!(user_id) 

    with{:ok, %Zone{} = zone} <- %Zone{} 
    |> Zone.changeset(attrs,user) 
    |> Repo.insert() 
    do 
    create_participant(zone,user) 
    end 
    end 

そして私はExUnitを使用してそれをテストしたいと思いますが、問題はテストフレームワークは、データベース内の実在しないレコードを検索しようとするということです。

** (Ecto.NoResultsError) expected at least one result but got none in query: 
    from u in Module.Accounts.User, 
    where: u.id == ^1 

私はテスト目的のために模擬したり作成したりできますか?

+0

https://github.com/eproxus/meckはあなたのためには機能しませんか?この関数はpublicなので、うまくいくはずです。 – Dogbert

答えて

1

Ectoを使用してデータベースに挿入する単純なファクトリモジュールを作成できます。テストはEcto.Sandboxによってデータベーストランザクションにラップされ、自動的にロールバックされます。

defmodule Factory do 
    def create(User) do 
    %User{ 
     name: "A. User", 
     email: "user_#{:rand.uniform(10000)}@mail.com" 
    } 
    end 

    def create(Zone) do 
    %Zone{ 
     # ... random/default zone attributes here... 
    } 
    end 

    def create(schema, attrs) do 
    schema 
    |> create() 
    |> struct(attributes) 
    end 

    def insert(schema, attrs \\ []) do 
    Repo.insert!(create(schema, attrs)) 
    end 
end 

テストでは、カスタム属性は、関連付けを含む工場出荷時のデフォルトとマージされます。

test "A test" do 
    user = Factory.insert(User, name: "User A") 
    zone = Zones.create_zone(user.id) 
    assert zone 
end 

詳細については、第7章を参照してください。

+1

ありがとうございます。私はex_machinaを使用して終了しましたが、これは基本的には同じですが、使いやすいインターフェースで行います。 – user2070502

関連する問題