Тест использует фиктивный контекст вместо реального, поэтому _context.SaveChanges();
на самом деле ничего не сделает, поэтому исключение не выдается.
Вы можете легко узнать, как правильно смоделировать DbContext, например, здесь или здесь
Также я думаю, что сам модульный тест должен быть написан по-другому. То есть здесь вы тестируете вызовы методов, которые являются базовой реализацией добавления записи.
Правильный модульный тест для этого случая проверит, вызывает ли вызов service.AddClass2(10, 100);
исключение. И отдельный тест должен быть написан, чтобы увидеть, появляется ли новая запись в DbSet в результате вызова метода service.AddClass2
вместо проверки того, что некоторые конкретные методы были вызваны.
UPD: пример установки IQueriable в качестве источника для поддельного контекста.
public static class MockDbSetExtensions
{
public static void SetSource<T>(this Mock<DbSet<T>> mockSet, IList<T> source) where T : class
{
var data = source.AsQueryable();
var iQuryableSet = mockSet.As<IQueryable<T>>();
iQuryableSet.SetupGet(m => m.Provider).Returns(data.Provider);
iQuryableSet.SetupGet(m => m.Expression).Returns(data.Expression);
iQuryableSet.SetupGet(m => m.ElementType).Returns(data.ElementType);
iQuryableSet.Setup(m => m.GetEnumerator()).Returns(data.GetEnumerator());
}
}
и пример использования:
[TestClass]
public class GigRepositoryTests
{
private GigRepository _repository;
private Mock<DbSet<Gig>> _mockGigs;
private Mock<IApplicationDbContext> mockContext;
[TestInitialize]
public void TestInitialize()
{
_mockGigs = new Mock<DbSet<Gig>>();
mockContext = new Mock<IApplicationDbContext>();
_repository = new GigRepository(mockContext.Object);
}
[TestMethod]
public void GetUpcomingGigsByArtist_GigsInThePast_ShouldNotBeReturned()
{
var gig = new Gig() {DateTime = DateTime.Now.AddDays(-1), ArtistId = "1"};
_mockGigs.SetSource(new List<Gig> {gig});
mockContext.SetupGet(c => c.Gigs).Returns(_mockGigs.Object);
var gigs = _repository.GetUpcomingGigs("1");
gigs.Should().BeEmpty();
} }