如何在Entity Framework中模拟 ObjectContext 或 ObjectQuery?
如何在Entity Framework中模拟 ObjectContext 或 ObjectQuery?
就我个人而言,我最喜欢免费工具中的Rhino.Mocks,但我们也使用TypeMock,它也是一个很棒的产品(但需要付费)。
App.Config
文件以用于测试数据库的连接字符串即可。我同意其他人的观点,你实际上无法模拟 ObjectContext。你应该使用 EF DbContext,因为你可以模拟基础的 DbSet。有很多文章介绍如何做到这一点,所以我不会详细说明。然而,如果你绝对必须使用 ObjectContext(由于某些原因),并且你想对其进行单元测试,那么你可以使用 InMemory 数据库。
首先安装这个 Nuget 包:Effort(Entity Framework Fake ObjectContext Realization Tool),它使用 NMemory 作为数据库。安装 Effort.EF6 包:
PM> Install-Package Effort.EF6
using System;
using System.Data.Common;
using System.Data.Entity;
using System.Data.Entity.Core.Objects;
using System.Data.Entity.Infrastructure;
using Effort;
public class DbContextHelper
{
//Fake object you can drop this if you are using your own EF context
private class DbObject
{
public Guid Id { get; set; }
public string Name { get; set; }
}
//Fake EF context you can switch with you own EF context
private class FakeDbContext : DbContext
{
public FakeDbContext(DbConnection connection)
: base(connection, true) { }
public virtual DbSet<DbObject> DbObjects { get; set; }
}
private FakeDbContext _dbContext;
public DbContextHelper()
{
//In memory DB connection
DbConnection effortConnection = DbConnectionFactory.CreatePersistent("TestInstanceName");
_dbContext = new FakeDbContext(effortConnection);
}
//You can expose your context instead of the DbContext base type
public DbContext DbContext => _dbContext;
public ObjectContext ObjectContext => ((IObjectContextAdapter)_dbContext).ObjectContext;
//Method to add Fake object to the fake EF context
public void AddEntityWithState(string value, EntityState entityState)
{
DbContext.Entry(new DbObject() { Id = Guid.NewGuid(), Name = value }).State = entityState;
}
}
使用方法:
DbContextHelper _dbContextHelper = new DbContextHelper();
_dbContextHelper.AddEntityWithState("added", System.Data.Entity.EntityState.Added);
_dbContextHelper.AddEntityWithState("added", System.Data.Entity.EntityState.Modified);
var objs = _dbContextHelper.ObjectContext.GetObjectStateEntries(EntityState.Modified | EntityState.Added);
现在你已经在内存数据库中拥有了你的对象。