Moq Generi c Шаблон репозитория - PullRequest
1 голос
/ 06 февраля 2020

У меня есть универсальные c сервисы, которые вызывают универсальный c репозиторий. Мне нужно управлять модульным тестом, но я не могу это сделать. Можете ли вы помочь мне?

public class EntityService<TEntity> : IEntityService<TEntity> where TEntity : class,  new()
{
    private readonly IRepositoryAsync<TEntity> _repository;

    public EntityService(IRepositoryAsync<TEntity> repository)
    {
        _repository = repository;
    }

    public virtual IQueryable<TEntity> Entities => Queryable();
    public virtual bool Delete(object id)
    {
        if (id == null)
            throw new ArgumentNullException(nameof(id));

        TEntity entity = _repository.Find(id);

        if (entity != null)
            return Delete(entity);

        return false;
    }
}

GENERI C Хранилище

public class Repository<TEntity> : IRepositoryAsync<TEntity> where TEntity : class,  new()
{
    private readonly IDataContextAsync _context;
    private readonly DbSet<TEntity> _dbSet;

    public Repository(IDataContextAsync context)
    {
        _context = context ?? throw new ArgumentNullException(nameof(context));

        if (context is DbContext dbContext)
            _dbSet = dbContext.Set<TEntity>();
    }

    public virtual void Delete(object id)
    {
        TEntity entity = _dbSet.Find(id);
        Delete(entity);
    }
}

Я попытался сделать следующее:

Я создал реферат generi c test

public abstract class EntityServiceUnitTests<TEntity> where TEntity : class, IEntity,new()
{
    private readonly IEntityService<TEntity> _service;

    public EntityServiceUnitTests()
    {
        _service = CreateSystemUnderTest();
    }

    [Test]
    [TestCase("299cd2b5-ab47-4006-9a47-c85e4770e9b1")]
    public void Delete_EntityWithExistUniqueIdentifier_ReturnsTrue(Guid id)
    {
        bool response = _service.Delete(id);

        Assert.True(response);
    }

    protected abstract IEntityService<TEntity> CreateSystemUnderTest();
}

Чем я реализовал бетон для юнит-теста

public class ConcreteEntityServiceUnitTests : EntityServiceUnitTests<Data>
{
    protected override IEntityService<Data> CreateSystemUnderTest()
    {
        MockBehavior behavior = MockBehavior.Strict;

        Mock<IRepositoryAsync<Data>> repoMock = new Mock<IRepositoryAsync<Data>>(behavior);

        repoMock.Setup(s => s.Queryable()).Returns(DataList().AsQueryable);

        SetupService();

        IEntityService<Data> entityService = new EntityService<Data>(repoMock.Object);

        return entityService;
    }

    private void SetupService()
    {
        Mock<IEntityService<Data>> service = new Mock<IEntityService<Data>>();
        service.Setup(s => s.Find(It.Is<Data>(f => f.Id == It.IsAny<Guid>()))).Returns(DataList().FirstOrDefault(w => w.Id == It.IsAny<Guid>()));
    }

    private IList<Data> DataList()
    {
        List<Data> dataList = new List<Data>();
        dataList.Add(new Data
        {
            Id = new Guid("299cd2b5-ab47-4006-9a47-c85e4770e9b1"),
            ObjectState = ObjectState.Added
        });
        dataList.Add(new Data
        {
            Id = new Guid("229cd2b5-ab47-4006-9a47-c85e4770e9b1"),
            ObjectState = ObjectState.Added
        });
        return dataList;
    }
}

Как ошибка я получаю:

Moq.MockException :  
IRepository<Data>.Find([299cd2b5-ab47-4006-9a47-c85e4770e9b1])
invocation failed with mock behavior Strict.
...