Up until this point, I had mostly been using nHibernate for my ORM solution in most applications I work on. So when I started diving into Entity Framework (EF) models and trying to write unit tests against logic that lives in EF entities, I first encountered the ObjectSet<T> type.
Now to be clear, I was not writing unit tests against EF generated code, but rather against some custom business logic that we had living in a partial class of an EF entity.
In order to test this logic, I had to have a way to create an ObjectSet. Well…I noticed that this entity did not implement any interfaces by default, so I would first need to have it implement IObjectSet<T>.
Once I did that, I could now create a mock of that type. Using Moq (my favorite .NET mocking library), I created a mock of that type, but realized it was always empty when enumerating over it. There did not appear to be an easy way to hydrate the mock, so to speak. *By the way if anyone has successfully mocked an IObjectSet type using Moq, please share how you did it. I would love to know, and I’m sure it’s possible.
Anyways, this is what I had to do… Using an implementation of a mock ObjectSet, provided below, I was able to use Moq to successfully CreateMany() and populate an ObjectSet for my tests.
Credit for code is given to: http://www.codeproject.com/Articles/447988/How-to-Mock-Test-an-Entity-Framework-Model-First-P’
using System; using System.Linq; using System.Collections; using System.Collections.Generic; using System.Data.Objects; namespace MyApplication { public partial class MockObjectSet<T> : IObjectSet<T> where T : class { private readonly IList<T> collection = new List<T>(); #region IObjectSet<T> Members public void AddObject(T entity) { collection.Add(entity); } public void Attach(T entity) { collection.Add(entity); } public void DeleteObject(T entity) { collection.Remove(entity); } public void Detach(T entity) { collection.Remove(entity); } #endregion #region IEnumerable<T> Members public IEnumerator<T> GetEnumerator() { return collection.GetEnumerator(); } #endregion #region IEnumerable Members IEnumerator IEnumerable.GetEnumerator() { return collection.GetEnumerator(); } #endregion #region IQueryable<T> Members public Type ElementType { get { return typeof(T); } } public System.Linq.Expressions.Expression Expression { get { return collection.AsQueryable<T>().Expression; } } public IQueryProvider Provider { get { return collection.AsQueryable<T>().Provider; } } #endregion } }
I struggled for a while, trying not to use any type of concrete fake class to do this, but ultimately I had to. So that’s why I’m wondering if anyone else was able to find a way to do this wihout any “real” implementations?
If you find yourself struggling to mock IObjectSet<T> or ObjectSet<T> for any of your unit tests, it’s probably easier to just use this dummy code to do it.
thanks and happy coding/testing!
Leave A Comment