Меня попросили написать модульные тесты с использованием рамки Moq. Я довольно новичок в том, как писать тесты Moq в C#.реальная цель фрейма moq
Я иду через этот MSDN link
Вот что я делаю прямо сейчас, как мы используем инъекции зависимостей на хранилище
//Repository
public interface IRepo
{
IQueryable<MyModel> GetById(long userId);
}
public class Repo : BaseManager, IRepo
{
public Repo(myDbContext context)
{
dbContext = context; //dbContext is from BaseManager class
}
public IQueryable<MyModel> GetById(long userId)
{
return dbContext.MyModel.Where(x => x.IsActive && x.UserId == userId);
}
}
//Test class
public class Test
{
Mock<DbSet<MyModel>> mockSet;
Mock<myDbContext> mockContext;
Mock<IRepo> mockRepository;
[TestInitialize]
public void Setup()
{
var data = new List<MyModel>{
//3 records
}.AsQueryable();
var mockSet = new Mock<DbSet<MyModel>>();
mockSet.As<IQueryable<MyModel>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<MyModel>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<MyModel>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<MyModel>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext = new Mock<myDbContext>();
mockContext.Setup(c => c.MyModel).Returns(mockSet.Object);
mockRepository = new Mock<IRepo>();
mockRepository.Setup(m => m.GetById(It.IsAny<long>())).Returns(data); //Here the GetById method is set to return all 3 records set in data object.
}
[TestMethod]
public void Test_Mock_For_Nothing()
{
var controller = new MyController(mockRepository.Object);
var result = controller.GetById(1); //this will call GetById method in the repository
Assert.AreEqual(result.Count(), 1);//This will fail as we will get count as 3
}
}
Таким образом, логика в хранилище никогда не выполняется, хотя Я издевался над контекстом и хранилищем. Поскольку метод GetById будет напрямую возвращать результат с 3 записями в соответствии с фиктивными данными.
Я ожидаю, что фиктивные данные будут отфильтрованы на основе логики в методе репозитория. Возможно ли это с помощью Moq?
Какова реальная цель использования инфраструктуры Moq, когда код репозитория не выполняется?
Где вы указываете 'mockRepository'' mockContext' ?? –
Почему вы издеваетесь над контекстом, когда вы уже издевались над хранилищем. Сама природа насмешек говорит, забыть все, кроме одного метода, который я использую: «Этот метод должен дать мне эти данные». В этих обстоятельствах нет необходимости беспокоиться об этом контексте. –
@CallumLinington Мне нужны данные, которые будут проходить через репозиторий и возвращать действительный список элементов.Так что я тоже издеваюсь над контекстом –