Я являюсь новичком для тестирования модулей и испытываю трудности с тестированием некоторых из моих методов в контроллере учетных записей, использующих 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() { }
}
Спасибо за ответ. Итак, вы говорите, что мне нужно жестко кодировать значения, чтобы сказать список ApplicationUsers, в моем классе TestProductDbSer? Но почему я не могу получить доступ к таким переменным, как Id, имя пользователя и т. Д., Которые унаследованы от класса IdentityUser? – CH15
Да, это самый простой способ иметь данные. Вы также можете иметь конструктор или свойство для установки/переопределения коллекции в каждом тестовом классе. Я не уверен, почему вы не видите свои свойства. Любая вероятность, что они являются «внутренними», а «TestDbSet» - в другой сборке или пространстве имен. Вы пытались ввести их вручную, чтобы убедиться, что это не просто проблема с IntelliSense? – molnargab
Я создал коллекцию ApplicationUser, и я создал AccountController с TestStoreAppContext, как вы посоветовали. Я получаю исключение нулевого указателя в моем методе тестирования для «Имя параметра: Запрос». После некоторого поиска в Интернете я нашел решение, добавив следующую строку к моему методу: var request = new HttpRequestMessage (HttpMethod.Post, «http: // 62214/api/Account/Register/Password-1»); controller.Request = запрос; Но тогда я получаю исключение Null Pointer с «Имя параметра: Контекст». // Комментарий продолжался ниже – CH15