2 Stimmen

Unit Testing Entity Framework ObjectContext in ASP.NET-Anwendung

Ich erstelle den Entity Framework ObjectContext per ASP.NET Request mit folgendem Code:

 public static class ObjectContextPerRequest
    {
        public static EStudyTestDatabaseEntities Context
        {
            get
            {
                var _context = HttpContext.Current.Items["EStudyModel"] as EStudyTestDatabaseEntities; 

                if(_context == null)
                {
                    _context = new EStudyTestDatabaseEntities(); 
                    HttpContext.Current.Items.Add("EStudyModel", _context);
                }

                return _context; 
            }
        }

        public static void RemoveContext()
        {
            var _context = HttpContext.Current.Items["EStudyModel"] as EStudyTestDatabaseEntities; 

            if(_context != null)
            {
                _context.Dispose();
            }
        }
    }

Im Repository verwende ich es wie folgt:

public class RoleRepository : IRoleRepository
    {
        public IList<Role> GetAll()
        {
            using(var db = ObjectContextPerRequest.Context)
            {
                return db.RoleSet.ToList(); 
            }
        }
    }

Dies funktioniert problemlos, wenn ich die Anwendung ausführe. Das Problem ist, wie ich das Repository testen werde, weil ich einen HttpContext erstellen muss.

  [TestFixture]
    public class when_getting_all_roles
    {
        [Test]
        public void should_get_roles_successfully()
        {
            var repository = new RoleRepository();
            Assert.AreNotEqual(4,repository.GetAll()); 
        }
    }

UPDATE:

Ich kann IObjectContextPerRequest-Schnittstelle und ObjectContextPerRequest wie unten gezeigt machen:

 public interface IObjectContextPerRequest
    {
        EStudyTestDatabaseEntities Context { get; }
        void RemoveContext(); 
    }

Und jetzt kann ich meinen Test wie folgt schreiben:

[TestFixture]
    public class when_getting_all_roles
    {
        [Test]
        public void should_get_roles_successfully()
        {
            var objectContextPerRequestStub = MockRepository.GenerateStub<IObjectContextPerRequest>();

            objectContextPerRequestStub.Expect(x => x.Context).Return(new EStudyTestDatabaseEntities()); 

            var repository = new RoleRepository(objectContextPerRequestStub);
            Assert.AreNotEqual(4,repository.GetAll()); 

        }
    }

2voto

LukLed Punkte 30806

Sie können zwei Repository-Konstruktoren definieren und einen in Tests und den zweiten in der Anwendung verwenden:

public class Repository
{
    private ObjectContext _ctx;

    public Repository()
    {
        _ctx = ObjectContextPerRequest.Context;
    }

    public Repository(ObjectContext ctx)
    {
        _ctx = ctx;
    }
}

Sie könnten nur einen Konstruktor definieren, wenn Sie einen IOC-Container verwenden, aber das ist viel mehr zu erklären.

Mit Konstruktoren werden Tests einfacher zu schreiben sein:

[TestFixture]
public class when_getting_all_roles
{
    [Test]
    public void should_get_roles_successfully()
    {
        var repository = new RoleRepository(new EStudyTestDatabaseEntities());
        Assert.AreNotEqual(4,repository.GetAll()); 
    }
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X