2017-09-25 4 views
0

Je teste actuellement un contrôleur qui utilise la fonction create_zone qui dépend d'une fonction qui récupère un utilisateur pour l'associer à une zone, puis crée une entrée de participant qui est seulement une table d'association des deux EntréesPhoenix Elixir: fonctions internes fictives

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 

Et je voudrais le tester en utilisant ExUnit mais le problème est que le cadre de contrôle tente de rechercher un dossier non existant dans la base de données.

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

Comment pourrais-je le simuler ou le créer uniquement à des fins de test?

+0

Se moque-t-il avec, par ex. https://github.com/eproxus/meck ne fonctionne pas pour vous? La fonction est publique, donc cela devrait fonctionner. – Dogbert

Répondre

1

Vous pouvez écrire un module d'usine simple qui utilise Ecto pour l'insérer dans la base de données. Le test sera enveloppé dans une transaction de base de données et annulé automatiquement grâce à l'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 

Puis dans votre test les attributs personnalisés sont fusionnés avec les valeurs par défaut, y compris les associations.

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

Voir le chapitre 7 de what's new in ecto 2.1 pour une explication plus détaillée.

+1

Merci. J'ai fini par utiliser ex_machina qui fait essentiellement la même chose mais dans une interface plus facile à utiliser. – user2070502