Mocking Linq2db DataConnection

625
17 января 2018, 14:18

Доброго времени суток!

Сегодня для написания Unit - тестов решил использовать фреймворк Moq.

Тестирую WebApi (.net core). Тестовый фреймворк - xunit.

Столкнулся с проблемой разорвать порочную связь: контроллер-дб.

Пытался сделать Mock объекта ITable, но всё напрасно. Перерыл все форумы и статьи. Многие советуют уходить от Mock'инга DataConnection(DbContext) и делать всё через транзакции на живую в боевой БД.

Повторюсь, пишу Unit-тесты. А данные подходы являются полу интеграционными.

Вот допустим контроллер:

public class UserController 
{
   private DataManager db = null;
   public UserController(DataManager dataManager)
   {
      this.db= dataManager;
   }
   public JsonResult Get()
   {
      var userDb = db.User.ToList();
      var result = GetResponse(userDb); // Метод сериализующий данные в JsonResult 
      return result;
    }
}

DataManager представляет собой сгенерированную по существующей таблице T4 модель (класс), сущность которого передаётся в контроллер через DI:

public partial class DataManager : LinqToDB.Data.DataConnection
    {
        public ITable<User> User { get { return this.GetTable<User>(); } }
        partial void InitDataContext();
    }

Вот данное свойство DataManager.User и не получается Mock'нуть У кого нибудь получилось подсунуть вместо данного свойства ITable какой-нибудь List, который можно ручками для тестов составить(вместо коннекта к реальной бд)????

На данный момент написал вот такой тест:

public class UserControllerTests
    {
        [Fact]
        public void TestGet()
        {
            // Arrange
            IEnumerable<User> expectedMas = new User[]
        {
            new User{ Id=1, Name= "q", Age=1, SurName= "q"},
            new User{ Id=2, Name= "w", Age=2, SurName= "w"}
        };
            var mock = new Mock<DataManager>();
            mock.Setup(usr => usr.User()).Returns(expectedMas); // Тут естественно ошибка компиляции, т.к. нельзя IEnumerable<User> привести к ITable<User>
            UserController controller = new UserController(mock.Object); 
            // Act
            var result = controller.Get() as IEnumerable<User>;
            // Assert
            Assert.NotNull(result);
            Assert.Equal(expectedMas, result);
        }
    }
READ ALSO
Как использовать переменные из цикла? C#

Как использовать переменные из цикла? C#

Например, я создал переменные a1,a2,a3

241
В чем отличие между .NET Core SDK и .NET Core Runtime?

В чем отличие между .NET Core SDK и .NET Core Runtime?

В чем отличие междуNET Core SDK и

259
Библиотека для склонения по падежам

Библиотека для склонения по падежам

На просторах интернета пруд пруди онлайн-сервисов, но хочется чего-нибудь автономного

333
Дубликаты файлов. Unable to convert classes to dex - Unity

Дубликаты файлов. Unable to convert classes to dex - Unity

Необходимо внедрить play-services-gcm-100

222