Я собираюсь написать книгу Apress ASP.NET MVC 3 и пытаюсь обеспечить создание модульных тестов для всего возможного, но потратив большую часть дня, пытаясь понять, почему редактирование не будетсохранить (см. этот вопрос SO ) Я хотел создать модульный тест для этого.
Я решил, что мне нужно создать модульный тест для следующего класса:
public class EFProductRepository : IProductRepository {
private EFDbContext context = new EFDbContext();
public IQueryable<Product> Products {
get { return context.Products; }
}
public void SaveProduct(Product product) {
if (product.ProductID == 0) {
context.Products.Add(product);
}
context.SaveChanges();
}
public void DeleteProduct(Product product) {
context.Products.Remove(product);
context.SaveChanges();
}
}
public class EFDbContext : DbContext {
public DbSet<Product> Products { get; set; }
}
Я использую Ninject.MVC3 и Moq и уже создал несколько модульных тестов (работая, хотя уже упоминавшуюся ранее книгу), поэтому медленно обдумываю это.Я уже (надеюсь, правильно) создал метод конструктора, чтобы позволить мне передать _context
:
public class EFProductRepository : IProductRepository {
private EFDbContext _context;
// constructor
public EFProductRepository(EFDbContext context) {
_context = context;
}
public IQueryable<Product> Products {
get { return _context.Products; }
}
public void SaveProduct(Product product) {
if (product.ProductID == 0) {
_context.Products.Add(product);
} else {
_context.Entry(product).State = EntityState.Modified;
}
_context.SaveChanges();
}
public void DeleteProduct(Product product) {
_context.Products.Remove(product);
_context.SaveChanges();
}
}
НО это - то, где у меня начинаются проблемы ... Я полагаю, что мне нужно создать Интерфейсдля EFDbContext
(см. ниже), чтобы я мог заменить его на фиктивный репо для тестов, НО он построен на классе DbContext
:
public class EFDbContext : DbContext {
public DbSet<Product> Products { get; set; }
}
из System.Data.Entity
и не могуя работаю над тем, как создать для него интерфейс ... Если я создаю следующий интерфейс, я получаю ошибки из-за отсутствия метода .SaveChanges()
из класса DbContext
и не могу построить интерфейсиспользуя «DbContext», как «EFDbContext», так как это класс, а не интерфейс ...
using System;
using System.Data.Entity;
using SportsStore.Domain.Entities;
namespace SportsStore.Domain.Concrete {
interface IEFDbContext {
DbSet<Product> Products { get; set; }
}
}
Исходный источник можно получить из «Исходного кода / Загрузок» на thispage если я что-то пропустил во фрагментах кода выше (или просто спросите, и я добавлю это).
Я достиг предела того, что я понимаю, и не знаю, что я ищуили читать, я не могу понять, как пройти через это. Пожалуйста, помогите!