我想找到最好的方法来做这件事 - 我已经花了几个小时进行了大量搜索,但无法使其工作。我需要一双新鲜的眼睛和角度。
我正在尝试创建一个简单的应用程序。 它将使用EF 6.1.0作为数据访问层(DAL)。
我有一个名为User的实体。 我还有另一个名为WorkItem的实体。
一个用户可以有多个WorkItems。
我已经创建了一个名为“TimesheetsContext”的EFDbContext。 它继承自DbContext并具有两个虚拟属性:
最后,我有一个像这样的测试,但是当我添加用户时,仍然返回3,断言失败:
我正在尝试创建一个简单的应用程序。 它将使用EF 6.1.0作为数据访问层(DAL)。
我有一个名为User的实体。 我还有另一个名为WorkItem的实体。
一个用户可以有多个WorkItems。
我已经创建了一个名为“TimesheetsContext”的EFDbContext。 它继承自DbContext并具有两个虚拟属性:
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和User库仅具有Add、Login、Update等功能,这些功能又调用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());
我这样做是错的吗?