Я только начинаю изучать модульное тестирование и насмешку. Я провел весь день, читая разные учебники, пытаясь найти лучшее, на что можно практиковаться. Я остановился на Testing with a mocking framework (EF6 onwards), так как он использует EF6 (современный), а также то, что кажется очень популярным фальшивым фреймворком (Moq). Кроме того, он довольно ваниль и размещен на веб-сайте MSDN. Он должен быть порядочным, не так ли?Почему мой фиктивный набор пуст?
Я настроил проект точно так, как указано в примере, и я запускаю отладчик с помощью тестовых примеров, чтобы убедиться, что я понимаю, что происходит. Тест я работаю через это следующим образом:
[TestClass]
public class QueryTests
{
[TestMethod]
public void GetAllBlogs_orders_by_name()
{
var data = new List<Blog>
{
new Blog { Name = "BBB" },
new Blog { Name = "ZZZ" },
new Blog { Name = "AAA" },
}.AsQueryable();
var mockSet = new Mock<DbSet<Blog>>();
mockSet.As<IQueryable<Blog>>().Setup(m => m.Provider).Returns(data.Provider);
mockSet.As<IQueryable<Blog>>().Setup(m => m.Expression).Returns(data.Expression);
mockSet.As<IQueryable<Blog>>().Setup(m => m.ElementType).Returns(data.ElementType);
mockSet.As<IQueryable<Blog>>().Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
var mockContext = new Mock<BloggingContext>();
mockContext.Setup(c => c.Blogs).Returns(mockSet.Object);
var service = new BlogService(mockContext.Object);
//test code here
var blogs = service.GetAllBlogs();
Assert.AreEqual(3, blogs.Count);
Assert.AreEqual("AAA", blogs[0].Name);
Assert.AreEqual("BBB", blogs[1].Name);
Assert.AreEqual("ZZZ", blogs[2].Name);
}
}
Это очень просто, и я привожу к считаем, что я понимание модульного тестирования и насмешливые рамок. Круто! Я решил провести эксперимент для проверки себя, вставив service.AddBlog("ADO.NET Blog", "http://blogs.msdn.com/adonet");
(из предыдущего примера) в вышеупомянутый TestMethod, сразу после того, как служба была создана.
Я ожидаю, что, пройдя мимо var blogs = service.GetAllBlogs();
, блоги должны содержать мою новую запись, но это не так. Он содержит только 3 из инициализации data
.
Что здесь происходит? Не должен ли этот код вставить запись блога в объект data
и, таким образом, потянуть его при вызове GetAllBlogs()
? Возможно, я неправильно понимаю идею издевательств?
Издевательский 'DbSet', как известно, сложно.Я настоятельно рекомендую использовать шаблон репозитория и тестировать репозитории или комбинировать шаблон репозитория с базой данных в памяти, которую вы можете легко достичь с помощью Effort. Подробнее о последней технике в [моем блоге] (http://www.vannevel.net/2015/02/26/11/). Я очень не рекомендую пытаться издеваться над всем, что связано с EF, потому что оно превратит ваш код в спагетти. –