我正在使用實體框架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