vendredi 26 juin 2015

Unit testing extension methods, had a go, is this right, or gone around the houses?

I have my POCO library and i have entities that implement an interface called IEntityDelete.

Interface is very simple, looks something like this

public interface IEntityDelete 
{
    bool IsDeleted { get; set; }
}

So i have an entity that implements this interface, again very simple, looks something like this

public class MyEntity() : IEntityDelete
{
    public bool IsDeleted { get; set; }
}

I have an extension method, which i created this like

public static void MarkAsDeleted(this IEntityDelete entity)
{
    entity.IsDeleted = true;
}

Then i needed to check if this method was being called within one of my service methods in my unit tests. Service method is very basic, looks something like this.

public Task<int> DeleteByFlagAsync(MyEntity entity)
{
    entity.MarkAsDeleted();

    return _context.SaveChangesAsync();
}

Apparently you cannot test extension methods easily, without using Microsofts Moles framework, but i do not want another dependency.

I did some googl'ing and found 2 articles on this, and how to do about it, and would like to know if this is correct, or whether i have done something stupid.

Two articles i found where

http://ift.tt/1RCqIGQ http://ift.tt/1txjefR

They recommend using a wrapper class which aint static, so i ended up with this.

First created my wrapper interface

public interface IEntityDeleteWrapper 
{
    void MarkAsDeleted(IEntityDelete entity);
}

Create a class that implements this interface

public class EntityDeleteWrapper : IEntityDeleteWrapper
{
    public void MarkAsDeleted(IEntityDelete entity)
    {
        entity.IsDeleted = true;
        entity.DeletedDate = DateTime.Now;
        entity.DeletedByUserId = 546372819;
    }
}

Inject this interface into my service constructor

public MyService(IEntityDeleteWrapper deleteWrapper)
{
    _deleteWrapper = deleteWrapper;
}

Change my service method call to use the wrapper like so

public Task<int> DeleteByFlagAsync(MyEntity entity)
{
    _deleteWrapper.MarkAsDeleted(entity);

    return _context.SaveChangesAsync();
}

Aucun commentaire:

Enregistrer un commentaire