2017-09-28 10 views
0

J'essaye de créer le test unitaire pour un projet, qui utilise le cadre d'entité avec (Microsoft.AspNet.Identity inclus). Je crée le substituer à mes dbContext comme ceci:OneTimeSetup a échoué Nsubstitute pour Entity Framework et Test NUnit

 var applicationDbContext = Substitute.For<ApplicationDbContext>(); 

     var deviceTypeActionRulesMockSet = Substitute.For<DbSet<DeviceTypeActionRules>, IQueryable<DeviceTypeActionRules>>(); 
     var deviceTypeActionRulesData = new List<DeviceTypeActionRules> 
     { 
       new DeviceTypeActionRules() { ActionId = "CheckIn", DeviceTypeId = 1, Frequency = 60 }, 
       new DeviceTypeActionRules() { ActionId = "Turn On", DeviceTypeId = 2, Frequency = 20 }, 
       new DeviceTypeActionRules() { ActionId = "Turn Off", DeviceTypeId = 2, Frequency = 30 } 
     }.AsQueryable(); 

     ((IQueryable<DeviceTypeActionRules>)deviceTypeActionRulesMockSet).Provider.Returns(deviceTypeActionRulesData.Provider); 
     ((IQueryable<DeviceTypeActionRules>)deviceTypeActionRulesMockSet).Expression.Returns(deviceTypeActionRulesData.Expression); 
     ((IQueryable<DeviceTypeActionRules>)deviceTypeActionRulesMockSet).ElementType.Returns(deviceTypeActionRulesData.ElementType); 
     ((IQueryable<DeviceTypeActionRules>)deviceTypeActionRulesMockSet).GetEnumerator().Returns(deviceTypeActionRulesData.GetEnumerator()); 

     applicationDbContext.DeviceTypeActionRules.Returns(deviceTypeActionRulesMockSet); 

L'erreur se produit lorsque je tape la dernière ligne dans le code ci-dessus, je reçois l'erreur suivante:

Résultat Message: OneTimeSetUp: System.Data .Entity.ModelConfiguration.ModelValidationException: Une ou plusieurs erreurs de validation ont été détectées lors de la génération du modèle:

Castle.Proxies.IdentityUserRole :: EntityType 'IdentityUserRole' n'a pas de clé définie. Définissez la clé pour cet EntityType. Castle.Proxies.IdentityUserLogin:: EntityType 'IdentityUserLogin' n'a pas de clé définie. Définissez la clé pour cet EntityType. IdentityUserRoles: EntityType: EntitySet 'IdentityUserRoles' est basé sur le type 'IdentityUserRole' qui n'a aucune clé définie. IdentityUserLogins: EntityType: EntitySet 'IdentityUserLogins' est basé sur le type 'IdentityUserLogin' qui n'a aucune clé définie.

+0

Non lié, mais au lieu de se moquer manuellement 'DbContext', utilisez le fournisseur" InMemory ", qui fournira plus d'expérience IQueryble pour les données SQL. [Test avec InMemory] (https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory). – Fabio

Répondre

0

intérieur de mon ApplicationDbContext, j'ai changé les propriétés à être virtuel:

public virtual DbSet<DeviceTypeActionRules> DeviceTypeActionRules { get; set; } 

et qui semblait résoudre le problème ci-dessus.