Перемешивание IUnitOfWork и IRepositories - PullRequest
0 голосов
/ 17 апреля 2020

Я изучаю тестирование и хочу проверить свои методы 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; }
}
...