Test avec attribut Effort et TypeName

c# dbcontext effort entity-framework unit-testing

Question

J'aimerais tester du code, et pour ce faire, je devrais simuler DbContext défini dans DAL ( Entity Framework 6 - Code first ). Cela se passe généralement bien, mais je me suis heurté à un problème lorsque la classe de modèle de données utilise l'attribut TypeName . J'ai fabriqué un squelette pour démontrer le problème.

Le modèle de données:

[Table("Customer")]
public class Customer
{
    [Key]
    public int Id { get; set; }

    public string FirstName{ get; set; }

    public string LastName { get; set; }

    //this line causes the exception
    [Column(TypeName = "money")]
    public decimal Salary { get; set; }
}

La définition du contexte

[Table("Customer")]
public class Customer
{
    [Key]
    public int Id { get; set; }

    public string FirstName{ get; set; }

    public string LastName { get; set; }

    //this line causes the exception
    [Column(TypeName = "money")]
    public decimal Salary { get; set; }
}

Et une méthode factice pour générer un contexte factice avec des données:

[Table("Customer")]
public class Customer
{
    [Key]
    public int Id { get; set; }

    public string FirstName{ get; set; }

    public string LastName { get; set; }

    //this line causes the exception
    [Column(TypeName = "money")]
    public decimal Salary { get; set; }
}

Le problème est l'attribut TypeName . Quand c'est commenté, les tests passent. Mais si cette option est activée, une System.InvalidOperationException été System.InvalidOperationException , indiquant que

La séquence ne contient aucun élément correspondant

Pour résumer, mes questions sont les suivantes:

  • Existe-t-il un moyen d'utiliser Effort dans les tests même si la classe de modèle de données a des attributs?
  • Si non, quelle méthode alternative devrais-je choisir pour créer un faux DbContext?

Réponse acceptée

Je vous conseillerais de regarder EntityTypeConfigurations et de déplacer vos mappages ici: http://www.entityframeworktutorial.net/code-first/entitytypeconfiguration-class.aspx

Cela vous permettra de ne pas prendre en compte votre base de données actuelle utilisée et de tester vos entités / interfaces les utilisant sans prendre en compte Entity Framework.

Il me semble également que vous effectuez des tests d'intégration plutôt que des tests unitaires. Pour effectuer des tests unitaires, vous devez vous débarrasser de l'utilisation réelle de DbContext (votre implémentation actuelle utilise une implémentation EF concrète pour DAL, mais vous devez utiliser une abstraction à la place.)

Je recommanderais au moins d'envelopper votre DbContext dans une interface afin de pouvoir le moquer mieux / le stub:

public interface IDbContext {
      IDbSet<Customer> Customers { get; set; }
}



Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi