Я изучаю тестирование и хочу проверить свои методы BusinessLayer. Я использовал шаблон Repos / UOW для соединения BL с ms SQL. Бад, я немного застрял в насмешках ....
мой IRepos:
public interface IRepository<T> where T : class
{
T GetById(int Id);
IEnumerable<T> GetAll();
IEnumerable<T> Find(Expression<Func<T, bool>> predicate);
void Add(T entity);
void AddRange(IEnumerable<T> enitites);
void Remove(T entity);
void RemoveRange(IEnumerable<T> entities);
}
мой репо:
public class Repository<T> : IRepository<T> where T : class
{
protected readonly DbContext Context;
public Repository(DbContext context)
{
Context = context;
}
public void Add(T entity)
{
Context.Set<T>().Add(entity);
}
public void AddRange(IEnumerable<T> entities)
{
Context.Set<T>().AddRange(entities);
}
public IEnumerable<T> Find(Expression<Func<T, bool>> predicate)
{
return Context.Set<T>().Where(predicate);
}
public IEnumerable<T> GetAll()
{
return Context.Set<T>().ToList();
}
public T GetById(int id)
{
return Context.Set<T>().Find(id);
}
public void Remove(T entity)
{
Context.Set<T>().Remove(entity);
}
public void RemoveRange(IEnumerable<T> entities)
{
Context.Set<T>().RemoveRange(entities);
}
}
IUnitOfWork:
public interface IUnitOfWork : IDisposable
{
ICountryRepository Countries { get; }
ICityRepository Cities { get; }
IBillingAddressRepository BillingAddresses { get; }
IDeliveryAddressRepository DeliveryAddresses { get; }
IPrivateCustomerRepository PrivateCustomers { get; }
ICompanyRepository Companies { get; }
void Complete();
}
Мой UOW:
public class UnitOfWork : IUnitOfWork
{
private readonly BitsAndBytesDbContext _context;
public UnitOfWork(BitsAndBytesDbContext context)
{
_context = context;
Countries = new CountryRepository(_context);
Cities = new CityRepository(_context);
BillingAddresses = new BillingAddressRepository(_context);
DeliveryAddresses = new DeliveryAddressRepository(_context);
PrivateCustomers = new PrivateCustomerRepository(_context);
Companies = new CompanyRepository(_context);
}
public ICountryRepository Countries { get; private set; }
public ICityRepository Cities { get; private set; }
public IBillingAddressRepository BillingAddresses { get; private set; }
public IDeliveryAddressRepository DeliveryAddresses { get; private set; }
public IPrivateCustomerRepository PrivateCustomers { get; private set; }
public ICompanyRepository Companies { get; private set; }
public void Complete()
{
_context.SaveChanges();
}
public void Dispose()
{
_context.Dispose();
}
}
В BL у меня есть AddressManager, где мои первые методы должны добавить страну в базу данных
public class AddressManager : IAddressManager
{
private readonly IUnitOfWork _uow;
public AddressManager(IUnitOfWork uow)
{
_uow = uow;
}
public void AddCountry(Country country)
{
if (_uow.Countries.Find(x => x.Name == country.Name) is null)
{
_uow.Countries.Add(country);
_uow.Complete();
}
}
}
Для этого простого метода я хочу ZO написать тест с Xunit. Как следует
public class AddressManagerTest
{
[Theory]
[InlineData("Duitsland", "België", "Nederland", 3)]
[InlineData("Duitsland", "België", "België", 2)]
public void AddCountryTest(string countryNameA, string countryNameB, string countryNameC, int expectedCount)
{
// Assert
List<Country> countries = new List<Country>();
Country a = new Country() { Id = 1, Name = countryNameA };
Country b = new Country() { Id = 2, Name = countryNameB };
countries.Add(a);
countries.Add(b);
Country country = new Country { Name = countryNameC, Id = 3 };
Mock <ICountryRepository> mockCountrieRepos = new Mock<ICountryRepository>();
mockCountrieRepos.Setup(x => x.GetAll()).Returns(countries);
Mock<IUnitOfWork> mockUOW = new Mock<IUnitOfWork>();
mockUOW.Setup(x => x.Countries).Returns(mockCountrieRepos.Object);
AddressManager manager = new AddressManager(mockUOW.Object);
// Act
manager.AddCountry(country);
int actualCount = countries.Count;
// Assert
Assert.Equal(expectedCount, actualCount);
Assert.Contains(country, countries);
}
}
Я не совсем уверен, как я могу издеваться над репо и УАУ. В моих тестах постоянно говорится, что страны. Количество остается равным 2, когда я пытаюсь добавить страну, которая еще не существует в странах из Списка.
Моя CountryModel выглядит следующим образом
public class Country : Entity
{
public string Name { get; set; }
public IEnumerable<City> Cities { get; set; }
public override bool Equals(object obj)
{
if (obj.GetType() != typeof(Country) || obj is null)
{
return false;
}
if (this.Name != ((Country)obj).Name)
{
return false;
}
return true;
}
public override int GetHashCode() => Name.GetHashCode();
public static bool operator ==(Country a, Country b) => a.Equals(b);
public static bool operator !=(Country a, Country b) => !(a.Equals(b));
}
, где Entity
public class Entity
{
public int Id { get; set; }
public DateTime CreationDate { get; set; }
public DateTime ModifiedDate { get; set; }
}