我正在使用实体框架4+。模拟实体框架数据库
是否有可能通过一些随机数据从模式中自动创建一些MOCK数据库?在哪里整数,整数,字符串,放置一些GUID或其他什么...
这将帮助我调试我的应用程序很多。
谢谢你,詹姆斯
我正在使用实体框架4+。模拟实体框架数据库
是否有可能通过一些随机数据从模式中自动创建一些MOCK数据库?在哪里整数,整数,字符串,放置一些GUID或其他什么...
这将帮助我调试我的应用程序很多。
谢谢你,詹姆斯
转到此链接,看看这部分“播种自动创建的数据库初始数据”
您可以检查出this thread有关Visual Studio数据库专业人士。或者RedGate有一个similar tool。我不知道任何可以做到这一点的免费工具。
Mike,你的任何链接都与问题无关。第一个也许..但是...不。 – 2015-08-14 05:01:38
这里是图书馆,有助于生成测试数据 - http://autopoco.codeplex.com/
我发现this great tool与EF 4一起用于模拟数据库。基本上它只是一个T4模板,可以创建“常规”EF层,还可以创建可用于测试的模拟对象和接口。更多文档here。
一个警告,但。开箱即用,它不适合我,因为我的存储库代码调用了SaveChanges()和其他未在生成的接口中实现的方法。我能够通过从Microsoft的ObjectContext实现中提取接口并创建自己的IObjectContext接口来解决此问题。然后我创建了一个基类(用于模拟),它通过简单地将每个调用委派给一个注入的模拟来实现此接口。通过这种方式,我可以使用Moq在我的测试类中创建该片段,同时仍然保留在生成的模拟中跟踪插入,更新和删除的功能。
这里是我对“上下文”T4模板的修改来解决这个问题。对不起,我做了这件事,因为它太长了,所以不让我发布整个代码清单。
前fileManager.Process();
fileManager.StartNewFile("IObjectContext.cs");
WriteHeader();
WriteHeaderIncludeSystem();
WriteHeaderIncludeData();
WriteHeaderIncludeContainers();
WriteNamespaceBegin(code, namespaceName);
WriteObjectContextInterface(container, code);
WriteNamespaceEnd(namespaceName);
fileManager.StartNewFile(container.Name + "Mock.ObjectContext.cs");
WriteHeader();
WriteHeaderIncludeSystem();
WriteHeaderIncludeData();
WriteHeaderIncludeContainers();
WriteNamespaceBegin(code, namespaceName);
WriteObjectContextMockBase(container, code);
WriteNamespaceEnd(namespaceName);
添加该代码WriteInterface()
块之后添加该代码。
<#+
void WriteObjectContextInterface(EntityContainer container, CodeGenerationTools code)
{
#>
/// <summary>
/// The interface for the generic object context. This contains all of
/// the <code>ObjectContext</code> properties that are implemented in the
/// concrete ObjectContext class. This interface was created so these members
/// can be mocked, as ObjectContext doesn't have a default public constructor.
/// </summary>
<#=Accessibility.ForType(container)#> interface IObjectContext : IDisposable
{
void AcceptAllChanges();
void AddObject(string entitySetName, object entity);
TEntity ApplyCurrentValues<TEntity>(string entitySetName, TEntity currentEntity) where TEntity : class;
TEntity ApplyOriginalValues<TEntity>(string entitySetName, TEntity originalEntity) where TEntity : class;
void ApplyPropertyChanges(string entitySetName, object changed);
void Attach(System.Data.Objects.DataClasses.IEntityWithKey entity);
void AttachTo(string entitySetName, object entity);
int? CommandTimeout { get; set; }
DbConnection Connection { get; }
ObjectContextOptions ContextOptions { get; }
void CreateDatabase();
string CreateDatabaseScript();
EntityKey CreateEntityKey(string entitySetName, object entity);
T CreateObject<T>() where T : class;
ObjectSet<TEntity> CreateObjectSet<TEntity>() where TEntity : class;
ObjectSet<TEntity> CreateObjectSet<TEntity>(string entitySetName) where TEntity : class;
void CreateProxyTypes(IEnumerable<Type> types);
ObjectQuery<T> CreateQuery<T>(string queryString, params ObjectParameter[] parameters);
bool DatabaseExists();
string DefaultContainerName { get; set; }
void DeleteDatabase();
void DeleteObject(object entity);
void Detach(object entity);
void DetectChanges();
void Dispose();
int ExecuteFunction(string functionName, params ObjectParameter[] parameters);
ObjectResult<TElement> ExecuteFunction<TElement>(string functionName, params ObjectParameter[] parameters);
ObjectResult<TElement> ExecuteFunction<TElement>(string functionName, MergeOption mergeOption, params ObjectParameter[] parameters);
int ExecuteStoreCommand(string commandText, params object[] parameters);
ObjectResult<TElement> ExecuteStoreQuery<TElement>(string commandText, params object[] parameters);
ObjectResult<TEntity> ExecuteStoreQuery<TEntity>(string commandText, string entitySetName, MergeOption mergeOption, params object[] parameters);
object GetObjectByKey(System.Data.EntityKey key);
void LoadProperty(object entity, string navigationProperty);
void LoadProperty(object entity, string navigationProperty, MergeOption mergeOption);
void LoadProperty<TEntity>(TEntity entity, Expression<Func<TEntity, object>> selector);
void LoadProperty<TEntity>(TEntity entity, Expression<Func<TEntity, object>> selector, MergeOption mergeOption);
System.Data.Metadata.Edm.MetadataWorkspace MetadataWorkspace { get; }
ObjectStateManager ObjectStateManager { get; }
void Refresh(RefreshMode refreshMode, IEnumerable collection);
void Refresh(RefreshMode refreshMode, object entity);
int SaveChanges();
int SaveChanges(bool acceptChangesDuringSave);
int SaveChanges(SaveOptions options);
ObjectResult<TElement> Translate<TElement>(DbDataReader reader);
ObjectResult<TEntity> Translate<TEntity>(DbDataReader reader, string entitySetName, MergeOption mergeOption);
bool TryGetObjectByKey(EntityKey key, out object value);
}
<#+
}
#>
<#+
void WriteObjectContextMockBase(EntityContainer container, CodeGenerationTools code)
{
#>
/// <summary>
/// The default concrete implementation of IObjectContext that will be used for mocking.
/// This contains all of the <code>IObjectContext</code> members that are implemented in the
/// concrete ObjectContext class. This class was created so these members
/// can be mocked.
/// </summary>
<#=Accessibility.ForType(container)#> abstract class ObjectContextMockBase : IObjectContext
{
private readonly IObjectContext _objectContext;
public ObjectContextMockBase(IObjectContext objectContext)
{
if (objectContext == null)
throw new System.ArgumentNullException("objectContext");
_objectContext = objectContext;
}
public virtual void AcceptAllChanges()
{
_objectContext.AcceptAllChanges();
}
public virtual void AddObject(string entitySetName, object entity)
{
_objectContext.AddObject(entitySetName, entity);
}
public virtual TEntity ApplyCurrentValues<TEntity>(string entitySetName, TEntity currentEntity)
where TEntity : class
{
return _objectContext.ApplyCurrentValues<TEntity>(entitySetName, currentEntity);
}
public virtual TEntity ApplyOriginalValues<TEntity>(string entitySetName, TEntity originalEntity)
where TEntity : class
{
return ApplyOriginalValues<TEntity>(entitySetName, originalEntity);
}
public virtual void ApplyPropertyChanges(string entitySetName, object changed)
{
_objectContext.ApplyPropertyChanges(entitySetName, changed);
}
public virtual void Attach(System.Data.Objects.DataClasses.IEntityWithKey entity)
{
_objectContext.Attach(entity);
}
public virtual void AttachTo(string entitySetName, object entity)
{
_objectContext.AttachTo(entitySetName, entity);
}
public virtual int? CommandTimeout
{
get { return _objectContext.CommandTimeout; }
set { _objectContext.CommandTimeout = value; }
}
public virtual DbConnection Connection
{
get { return _objectContext.Connection; }
}
public virtual ObjectContextOptions ContextOptions
{
get { return _objectContext.ContextOptions; }
}
public virtual void CreateDatabase()
{
_objectContext.CreateDatabase();
}
public virtual string CreateDatabaseScript()
{
return _objectContext.CreateDatabaseScript();
}
public virtual EntityKey CreateEntityKey(string entitySetName, object entity)
{
return _objectContext.CreateEntityKey(entitySetName, entity);
}
public virtual T CreateObject<T>()
where T : class
{
return _objectContext.CreateObject<T>();
}
public virtual ObjectSet<TEntity> CreateObjectSet<TEntity>()
where TEntity : class
{
return _objectContext.CreateObjectSet<TEntity>();
}
public virtual ObjectSet<TEntity> CreateObjectSet<TEntity>(string entitySetName)
where TEntity : class
{
return _objectContext.CreateObjectSet<TEntity>(entitySetName);
}
public virtual void CreateProxyTypes(IEnumerable<Type> types)
{
_objectContext.CreateProxyTypes(types);
}
public virtual ObjectQuery<T> CreateQuery<T>(string queryString, params ObjectParameter[] parameters)
{
return _objectContext.CreateQuery<T>(queryString, parameters);
}
public virtual bool DatabaseExists()
{
return _objectContext.DatabaseExists();
}
public virtual string DefaultContainerName
{
get { return _objectContext.DefaultContainerName; }
set { _objectContext.DefaultContainerName = value; }
}
public virtual void DeleteDatabase()
{
_objectContext.DeleteDatabase();
}
public virtual void DeleteObject(object entity)
{
_objectContext.DeleteObject(entity);
}
public virtual void Detach(object entity)
{
_objectContext.Detach(entity);
}
public virtual void DetectChanges()
{
_objectContext.DetectChanges();
}
public virtual void Dispose()
{
_objectContext.Dispose();
}
public virtual int ExecuteFunction(string functionName, params ObjectParameter[] parameters)
{
return _objectContext.ExecuteFunction(functionName, parameters);
}
public virtual ObjectResult<TElement> ExecuteFunction<TElement>(string functionName, params ObjectParameter[] parameters)
{
return _objectContext.ExecuteFunction<TElement>(functionName, parameters);
}
public virtual ObjectResult<TElement> ExecuteFunction<TElement>(string functionName, MergeOption mergeOption, params ObjectParameter[] parameters)
{
return _objectContext.ExecuteFunction<TElement>(functionName, mergeOption, parameters);
}
public virtual int ExecuteStoreCommand(string commandText, params object[] parameters)
{
return _objectContext.ExecuteStoreCommand(commandText, parameters);
}
public virtual ObjectResult<TElement> ExecuteStoreQuery<TElement>(string commandText, params object[] parameters)
{
return _objectContext.ExecuteStoreQuery<TElement>(commandText, parameters);
}
public virtual ObjectResult<TEntity> ExecuteStoreQuery<TEntity>(string commandText, string entitySetName, MergeOption mergeOption, params object[] parameters)
{
return _objectContext.ExecuteStoreQuery<TEntity>(commandText, entitySetName, mergeOption, parameters);
}
public virtual object GetObjectByKey(EntityKey key)
{
return _objectContext.GetObjectByKey(key);
}
public virtual void LoadProperty(object entity, string navigationProperty)
{
_objectContext.LoadProperty(entity, navigationProperty);
}
public virtual void LoadProperty(object entity, string navigationProperty, MergeOption mergeOption)
{
_objectContext.LoadProperty(entity, navigationProperty, mergeOption);
}
public virtual void LoadProperty<TEntity>(TEntity entity, Expression<Func<TEntity, object>> selector)
{
_objectContext.LoadProperty<TEntity>(entity, selector);
}
public virtual void LoadProperty<TEntity>(TEntity entity, Expression<Func<TEntity, object>> selector, MergeOption mergeOption)
{
_objectContext.LoadProperty<TEntity>(entity, selector, mergeOption);
}
public virtual System.Data.Metadata.Edm.MetadataWorkspace MetadataWorkspace
{
get { return _objectContext.MetadataWorkspace; }
}
public virtual ObjectStateManager ObjectStateManager
{
get { return _objectContext.ObjectStateManager; }
}
public virtual void Refresh(RefreshMode refreshMode, IEnumerable collection)
{
_objectContext.Refresh(refreshMode, collection);
}
public virtual void Refresh(RefreshMode refreshMode, object entity)
{
_objectContext.Refresh(refreshMode, entity);
}
public virtual int SaveChanges()
{
return _objectContext.SaveChanges();
}
public virtual int SaveChanges(bool acceptChangesDuringSave)
{
return _objectContext.SaveChanges(acceptChangesDuringSave);
}
public virtual int SaveChanges(SaveOptions options)
{
return _objectContext.SaveChanges(options);
}
public virtual ObjectResult<TElement> Translate<TElement>(DbDataReader reader)
{
return _objectContext.Translate<TElement>(reader);
}
public virtual ObjectResult<TEntity> Translate<TEntity>(DbDataReader reader, string entitySetName, MergeOption mergeOption)
{
return _objectContext.Translate<TEntity>(reader, entitySetName, mergeOption);
}
public virtual bool TryGetObjectByKey(EntityKey key, out object value)
{
return _objectContext.TryGetObjectByKey(key, out value);
}
}
<#+
}
#>
改变第一2线(第二一个是大括号)的WriteMockContextBody()
(注释之后)
<#=Accessibility.ForType(container)#> partial class <#=code.Escape(container)#>Mock : ObjectContextMockBase, I<#=code.Escape(container)#>
{
public <#=code.Escape(container)#>Mock(IObjectContext objectContext)
: base(objectContext)
{
}
变化WriteInterface()
的第一行(注释之后)
<#=Accessibility.ForType(container)#> interface I<#=code.Escape(container)#> : IObjectContext
我也应该注意到,我还没有做过这么多的测试,但我确实做了一些基本的验证以确保它的功能。
该工具是否可以在VS2012中使用? – 2013-05-23 11:55:43
是的。我使用VS2012,它工作正常。 – NightOwl888 2013-05-24 12:58:01
您可以将文件粘贴到要点中,并添加一个链接? – Tracker1 2013-06-28 17:02:01
见拉布哈利特的博客标题为ADO.NET Mocking Context Generator: Visual Studio 2010 Template
这里拉布使用T4模板来创建EF接口。
虽然没有真正嘲笑。被测试的层仍然依赖于外部源。 – Jon 2012-11-16 13:51:40
我相信这是代码优先的数据库构建,而不是嘲弄。 – barrypicker 2014-01-07 17:20:29
这是什么样的公认解决方案? – 2015-08-14 04:59:46