Moq для уровня доступа к данным - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть контроллер.Откуда я звоню (DI of BLL) на уровень бизнес-логики (BLL).Из BLL я вызываю уровень доступа к данным (DAL) через еще один интерфейс.

Конструктор уровня DAL внедряется с помощью экземпляра DBContext (здесь не вводится интерфейс).

Таким образом, используя MOQ, мы можем тестировать контроллер, BLL и промежуточный уровень.Но как проверить уровень DLL?

    public class DAL():IDAL
    {
        private DBEntities entity;

        public DAL(DBEntities DB)
        {
            entity = DB;
        }

        public list<string> ABC()
        {
            var a = SqlMapper.Query<class>(entity.Database.Connection, "",param,commandType: CommandType.StoredProcedure).ToList();
            return a;
        }
    }

По сути, мой вопрос, как и что здесь издеваться?Здесь мы реализуем IDAL, но не вводим его здесь.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Вопрос до сих пор мне не ясен на 100%, но я пытаюсь дать ответ.

Не надо издеваться DBEntities.Если вы хотите убедиться, что ваши запросы возвращают правильный результат, протестируйте его с хорошо известной, предварительно заполненной базой данных, которую вы используете только для своих тестов.

Если вы хотите проверить свою бизнес-логику и вам нужно смоделировать ваши данныеслой доступа, тогда насмешка полезна!Поэтому создайте интерфейс с вашими методами:

public interface IDAL
{
    List<string> ABC();
}

В своем модульном тесте вы можете смоделировать интерфейс с помощью:

var dataAccessMock = new Mock<IDAL>();
dataAccessMock.Setup(x => x.ABC()).Returns(new List<string> {"ABC", "DEF", "GHI" });
// get an IDAL instance which you can inject / use
var mockedInstance = dataAccessMock.Object;
// get the mocked list
var list = mockedInstance.ABC();
0 голосов
/ 20 сентября 2018

Вы можете смоделировать и создать в конструкторе тестового класса для экземпляра DAL InMemoryDb, который будет просто пустой схемой вашей БД, чем дополнить его некоторыми данными, необходимыми для тестирования, и затем проверить ваши запросы.Вот как я это делаю.

    public class SomeTests : IDisposable
{
        public SomeTests()
        {
            var options = new DbContextOptionsBuilder<MyContext>()
                .UseInMemoryDatabase(Guid.NewGuid().ToString())
                .Options;

            _dbContext = new MyContext(options);
            _dbContext.Database.EnsureDeleted();
            _dbContext.Database.EnsureCreated();

            // you can provide some more settings here
        }

        public void Dispose()
        {
            _dbContext?.Dispose();
        }
}
...