2015-05-02 3 views
0

Я являюсь новичком для тестирования модулей и испытываю трудности с тестированием некоторых из моих методов в контроллере учетных записей, использующих ApplicationDbContext. Я следую этому руководству: http://www.asp.net/web-api/overview/testing-and-debugging/mocking-entity-framework-when-unit-testing-aspnet-web-api-2
, но я не могу получить доступ к некоторым переменным, связанным с приложением приложения. В моем контроллере аккаунта я могу получить доступ к идентификатору, имени пользователя, электронной почте и т. Д., Которые унаследованы от своего суперкласса «IdentityUser», но по какой-то причине я не могу получить доступ к этим переменным в своем тестовом контроллере. У меня есть реализация followig до сих пор:Модуль тестирования Контроллер учетной записи с ApplicationDbContext

interface IStoreAppContext : IDisposable 
    { 
     DbSet<ApplicationUser> Users { get; } 
     int SaveChanges(); 
     void MarkAsModified(ApplicationUser item); 
    } 

Мой класс IdentityModel:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, IStoreAppContext 
    { 
     public ApplicationDbContext() 
      : base("DefaultConnection", throwIfV1Schema: false) 
     { 
     } 

     public static ApplicationDbContext Create() 
     { 
      return new ApplicationDbContext(); 
     } 

     public DbSet<SportProgram> SportContext {get; set;} 
     public DbSet<Exercise> ExerciseContext { get; set; } 
     public DbSet<ExerciseImage> ExerciseImageContext { get; set; } 
     public DbSet<Store> StoreContext { get; set; } 


     public void MarkAsModified(ApplicationUser item) 
     { 
      Entry(item).State = EntityState.Modified; 
     } 

Я добавил следующее к моему AccountController:

private IStoreAppContext db2 = new ApplicationDbContext(); 

    // add these contructors 
    public AccountController() { } 

    public AccountController(IStoreAppContext context) 
    { 
     db2 = context; 
    } 

В моем тестовом проекте:

class TestProductDbSet : TestDbSet<ApplicationUser> 
    { 
     public override ApplicationUser Find(params object[] keyValues) 
     { 
      return this.SingleOrDefault(user => user. == (int)keyValues.Single()); 
     } 

Линия возврата выше является одним из первых мест, где у меня есть эта проблема. У меня есть «user => user.», И когда визуальная студия предлагает мои предложения после «.». все, что дано мне из класса ApplicationUser, - это переменные, которые я добавил, и я не могу получить доступ к идентификатору ApplicationUser, имени пользователя и электронной почте, которые унаследованы от класса IdentityUser. Может ли кто-нибудь помочь?

Вот еще один класс в моем тестовом проекте, который может помочь вам:

class TestStoreAppContext : IStoreAppContext 
    { 
     public TestStoreAppContext() 
     { 
      this.Products = new TestProductDbSet(); 
     } 

     public DbSet<ApplicationUser> Products { get; set; } 

     public int SaveChanges() 
     { 
      return 0; 
     } 

     public void MarkAsModified(ApplicationUser item) { } 
     public void Dispose() { } 
    } 

ответ

1

Ключевая идея здесь заключается в том, что вы заменяете EntityFramework доступ с коллекциями, так что вы можете использовать LINQ для объектов вместо LINQ к Entities , например для проверки логики ваших запросов.

Таким образом, ваш TestProductDbSet должен иметь член коллекции (ApplicationUser), который будет служить в качестве базы данных. Таким образом, у вас должны быть некоторые данные, заселенные для него.

Затем в ваших модульных тестах вы должны создать AccountController с TestStoreAppContext.

+0

Спасибо за ответ. Итак, вы говорите, что мне нужно жестко кодировать значения, чтобы сказать список ApplicationUsers, в моем классе TestProductDbSer? Но почему я не могу получить доступ к таким переменным, как Id, имя пользователя и т. Д., Которые унаследованы от класса IdentityUser? – CH15

+0

Да, это самый простой способ иметь данные. Вы также можете иметь конструктор или свойство для установки/переопределения коллекции в каждом тестовом классе. Я не уверен, почему вы не видите свои свойства. Любая вероятность, что они являются «внутренними», а «TestDbSet» - в другой сборке или пространстве имен. Вы пытались ввести их вручную, чтобы убедиться, что это не просто проблема с IntelliSense? – molnargab

+0

Я создал коллекцию ApplicationUser, и я создал AccountController с TestStoreAppContext, как вы посоветовали. Я получаю исключение нулевого указателя в моем методе тестирования для «Имя параметра: Запрос». После некоторого поиска в Интернете я нашел решение, добавив следующую строку к моему методу: var request = new HttpRequestMessage (HttpMethod.Post, «http: // 62214/api/Account/Register/Password-1»); controller.Request = запрос; Но тогда я получаю исключение Null Pointer с «Имя параметра: Контекст». // Комментарий продолжался ниже – CH15