You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
It would be nice to have some type of InMemoryProvider where I can pass data and I will be able to mock IDatabase.
Right now its almost impossible to mock it.
We created some quick solution, that should be refactored and maybe used.
It provide get methods. It is able to returns all data and for other (Any, Where, ...) it returns just first entity. Other methods are NotImplemented yet.
/// <summary>/// Class for mocking KORM IDatabase/// </summary>publicstaticclassInMemoryDatabaseHelper{/// <summary>/// Create simple in memory mock of KORM with given data./// </summary>/// <typeparam name="TData">Type of data.</typeparam>/// <param name="data">Data to be mocked.</param>/// <returns></returns>publicstaticIDatabaseBuildInMemory<TData>(IEnumerable<TData>data)=>Database.Builder.UseConnection("memory","test").UseQueryProviderFactory(CreateProvider(data)).Build();privatestaticInMemoryQueryProviderFactory<TData>CreateProvider<TData>(IEnumerable<TData>data)=>newInMemoryQueryProviderFactory<TData>(data);}internalclassInMemoryQueryProviderFactory<TData>:IQueryProviderFactory{privatereadonlyIEnumerable<TData>_data;publicInMemoryQueryProviderFactory(IEnumerable<TData>data){_data=data;}publicKORM.Query.IQueryProviderCreate(DbConnectionconnection,IModelBuildermodelBuilder,IDatabaseMapperdatabaseMapper){returnnewInMemoryQueryProvider<TData>(_data);}publicKORM.Query.IQueryProviderCreate(ConnectionStringSettingsconnectionString,IModelBuildermodelBuilder,IDatabaseMapperdatabaseMapper){returnnewInMemoryQueryProvider<TData>(_data);}}internalclassInMemoryQueryProvider<TData>:KORM.Query.IQueryProvider{privateconststringNotImplementedError="This method was not implemented yet. If you need to mock it please implement it by yourself.";privatereadonlyIEnumerable<TData>_data;publicInMemoryQueryProvider(IEnumerable<TData>data){_data=data;}publicIEnumerable<T>Execute<T>(IQuery<T>query)=>_data.Cast<T>();publicIQueryableCreateQuery(Expressionexpression)=>newInMemoryQuery<TData>(this,_data,expression);publicIQueryable<TElement>CreateQuery<TElement>(Expressionexpression)=>(IQueryable<TElement>)CreateQuery(expression);publicobjectExecute(Expressionexpression)=>_data.FirstOrDefault();publicTResultExecute<TResult>(Expressionexpression)=>(TResult)Execute(expression);
#region NotImplemented
publicDbProviderFactoryDbProviderFactory=>thrownewNotImplementedException(NotImplementedError);publicITransactionBeginTransaction(IsolationLevelisolationLevel)=>thrownewNotImplementedException(NotImplementedError);publicIBulkInsertCreateBulkInsert()=>thrownewNotImplementedException(NotImplementedError);publicIBulkUpdateCreateBulkUpdate()=>thrownewNotImplementedException(NotImplementedError);publicIIdGeneratorCreateIdGenerator(stringtableName,intbatchSize)=>thrownewNotImplementedException(NotImplementedError);publicvoidDispose()=>thrownewNotImplementedException(NotImplementedError);publicTaskExecuteInTransactionAsync(Func<Task>action)=>thrownewNotImplementedException(NotImplementedError);publicintExecuteNonQuery(stringquery)=>thrownewNotImplementedException(NotImplementedError);publicintExecuteNonQuery(stringquery,CommandParameterCollectionparameters)=>thrownewNotImplementedException(NotImplementedError);publicTask<int>ExecuteNonQueryAsync(stringquery)=>thrownewNotImplementedException(NotImplementedError);publicTask<int>ExecuteNonQueryAsync(stringquery,paramsobject[]paramValues)=>thrownewNotImplementedException(NotImplementedError);publicTask<int>ExecuteNonQueryAsync(stringquery,CommandParameterCollectionparameters)=>thrownewNotImplementedException(NotImplementedError);publicintExecuteNonQueryCommand(IDbCommandcommand)=>thrownewNotImplementedException(NotImplementedError);publicTask<int>ExecuteNonQueryCommandAsync(DbCommandcommand)=>thrownewNotImplementedException(NotImplementedError);publicobjectExecuteScalar<T>(IQuery<T>query)=>thrownewNotImplementedException(NotImplementedError);publicobjectExecuteScalarCommand(IDbCommandcommand)=>thrownewNotImplementedException(NotImplementedError);publicTask<object>ExecuteScalarCommandAsync(DbCommandcommand)=>thrownewNotImplementedException(NotImplementedError);publicTResultExecuteStoredProcedure<TResult>(stringstoredProcedureName)=>thrownewNotImplementedException(NotImplementedError);publicTResultExecuteStoredProcedure<TResult>(stringstoredProcedureName,CommandParameterCollectionparameters)=>thrownewNotImplementedException(NotImplementedError);publicDbCommandGetCommandForCurrentTransaction()=>thrownewNotImplementedException(NotImplementedError);publicvoidSetParameterDbType(DbParameterparameter,stringtableName,stringcolumnName)=>thrownewNotImplementedException(NotImplementedError);publicboolSupportsIdentity()=>thrownewNotImplementedException(NotImplementedError);publicboolSupportsPrepareCommand()=>thrownewNotImplementedException(NotImplementedError);
#endregion
}internalclassInMemoryQuery<TData>:IQueryable<TData>{privatereadonlyIEnumerable<TData>_data;publicTypeElementType=>typeof(TData);publicExpressionExpression{get;privateset;}publicSystem.Linq.IQueryProviderProvider{get;privateset;}publicInMemoryQuery(InMemoryQueryProvider<TData>queryProvider,IEnumerable<TData>data){Provider=queryProvider;Expression=data.AsQueryable().Expression;_data=data;}publicInMemoryQuery(InMemoryQueryProvider<TData>queryProvider,IEnumerable<TData>data,Expressionexpression){Provider=queryProvider;Expression=expression;_data=data;}publicIEnumerator<TData>GetEnumerator()=>_data.GetEnumerator();IEnumeratorIEnumerable.GetEnumerator()=>GetEnumerator();}
Mock IDatabase in UnitTests:
vardata=newList<Note>(){newNote(){Id=1,Note="Hello in memory KORM."}};vardatabase=InMemoryDatabaseHelper.BuildInMemory(data);publicclassNote{publicintId{get;set;}publicstringNote{get;set;}}
The text was updated successfully, but these errors were encountered:
It would be nice to have some type of InMemoryProvider where I can pass data and I will be able to mock IDatabase.
Right now its almost impossible to mock it.
We created some quick solution, that should be refactored and maybe used.
It provide get methods. It is able to returns all data and for other (Any, Where, ...) it returns just first entity. Other methods are NotImplemented yet.
Mock IDatabase in UnitTests:
The text was updated successfully, but these errors were encountered: