Я пытаюсь найти лучший способ сделать это - я искал ALOT в течение нескольких часов, но не могу заставить это работать. Мне нужны свежие глаза и перспектива.Основы Moq и Entity
Я пытаюсь создать прямое приложение. Он будет использовать EF 6.1.0 в качестве DAL.
У меня есть объект, называемый User. У меня есть другая организация под названием WorkItem
У пользователя может быть много WorkItems.
Я создал EFDbContext под названием «TimesheetsContext». Он наследует от DbContext и имеет 2 виртуального свойство:
public virtual IDbSet<WorkItem> WorkItems { get; set; }
public virtual IDbSet<User> Users { get; set; }
Я также имею IUnitOfWork (и его конкретный класс)
public interface IUnitOfWork
{
ITimeSheetContext Context { get; set; }
IWorkItemRepository WorkItemRepository { get; set; }
IUserRepository UserRepository { get; set; }
}
WorkItem и хранилище пользователя просто имеют такие функции, как добавление, Логин, обновление , который, в свою очередь, вызывает EfDBContext для выполнения операции запроса.
Теперь я хочу создать единичный тест, чтобы иметь возможность макетировать DbContext и иметь возможность добавлять пользователей или рабочие элементы. Однако я не могу заставить его работать.
Однажды, с вашей помощью, я получил это далеко, я могу легко изменить его, чтобы использовать уровень сервиса и передать в IUnitOfWork.
Используя Moq и EntityFramework.Testing.Moq, я не могу заставить его работать:
private Mock<TimeSheetContext> _mockContext;
// <snip />
Guid userId1 = Guid.NewGuid();
Guid userId2 = Guid.NewGuid();
Guid userId3 = Guid.NewGuid();
var users = new List<User>(new[]
{
new User { Firstname = "Joe", Lastname = "Bloggs", Password = "pass1", UserId = userId1, Username = "JoeBloggs" },
new User { Firstname = "Thom", Lastname = "Stevens", Password = "pass2", UserId = userId2, Username = "ThomStevens"},
new User { Firstname = "Homer", Lastname = "Simpson", Password = "pass3", UserId = userId3, Username = "HomerSimpson" }
}).AsQueryable();
var tasks = new List<LionTask>(new[]
{
new WorkItem { CreatedDate = DateTime.Today, Description = "Desc1", ModifiedDate = DateTime.Today, State = 1, TaskId = Guid.NewGuid(), Title = "Test Title", UserId = userId1 },
new WorkItem { CreatedDate = DateTime.Today, Description = "Desc2", ModifiedDate = DateTime.Today, State = 2, TaskId = Guid.NewGuid(), Title = "Test Title 2", UserId = userId2 },
new WorkItem { CreatedDate = DateTime.Today, Description = "Desc3", ModifiedDate = DateTime.Today, State = 3, TaskId = Guid.NewGuid(), Title = "Test Title 3", UserId = userId3 }
}).AsQueryable();
this._mockContext = new Mock<TimeSheetContext>();
var taskDbSetMock = new Mock<IDbSet<WorkItem>>();
var userDbSetMock = new Mock<IDbSet<User>>();
userDbSetMock.As<IQueryable<User>>().Setup(m => m.Provider).Returns(users.Provider);
userDbSetMock.As<IQueryable<User>>().Setup(m => m.Expression).Returns(users.Expression);
userDbSetMock.As<IQueryable<User>>().Setup(m => m.ElementType).Returns(users.ElementType);
userDbSetMock.As<IQueryable<User>>().Setup(m => m.GetEnumerator()).Returns(users.GetEnumerator());
taskDbSetMock.As<IQueryable<WorkItem>>().Setup(m => m.Provider).Returns(tasks.Provider);
taskDbSetMock.As<IQueryable<WorkItem>>().Setup(m => m.Expression).Returns(tasks.Expression);
taskDbSetMock.As<IQueryable<WorkItem>>().Setup(m => m.ElementType).Returns(tasks.ElementType);
taskDbSetMock.As<IQueryable<WorkItem>>().Setup(m => m.GetEnumerator()).Returns(tasks.GetEnumerator());
this._mockContext.Setup(c => c.Users).Returns(userDbSetMock.Object);
this._mockContext.Setup(c => c.WorkItems).Returns(taskDbSetMock.Object);
Наконец, я тогда есть тест, как это, но когда я добавить пользователя, я еще вернусь 3 и Неисправность подтверждения:
User u = new User { Firstname = "Timmy", Lastname = "Johanson", Password = "omg123", UserId = Guid.NewGuid(), Username = "TJ" };
this._mockContext.Object.Users.Add(u);
Assert.AreEqual(4, this._mockContext.Object.Users.Count());
Я собираюсь сделать это неправильно?
А что, собственно, происходит? –
@JohnSaunders - контекст все еще содержит 3 элемента, а не 4, когда я добавляю новый элемент пользователя. Я хочу иметь возможность сохранять и видеть какие-либо обновления/изменения при вызове fooed up context/Repository. –
Это может вас заинтересовать: http://vannevel.net/blog/2015/02/26/11/ –