Mocking a generic ObjectSet or IObjectSet for Unit Testing Entity Framework Business Logic

Mocking a generic ObjectSet or IObjectSet for Unit Testing Entity Framework Business Logic

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!

By | 2014-08-28T21:35:42+00:00 August 28th, 2014|Categories: C#, Testing|Tags: |0 Comments

About the Author:

Leave A Comment