2016-03-23 19 views
0

Projelerimden birinde bir iş mantığı bileşeni test etmek istiyorum.Ünite testinde Entity Framework bağlamı nasıl taklit edilir veya değiştirilir?

BL:

public class CommunicationService 
{ 
    IContext context; 

    public CommunicationService() 
    { 
     var kernel = new StandardKernel(new NinjectConfig()); 
     context = kernel.Get<IContext>(); 
    } 

    // This creates a file 
    public void SomeMethodThatUsesIContext() { ... } 
} 

NinjectConfig:

class NinjectConfig : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IContext>().To<CommunicationDbContext>(); 
    } 
} 

Birim testi:

class FakeNinjectConfig : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IContext>().To<FakeDbContext>(); 
    } 
} 
:

[TestMethod] 
public void ScheduleTransportOrder_1() 
{ 
    communicationService = new CommunicationService(); 
    communicationService.SomeMethodThatUsesIContext(); 
    Assert.IsTrue(...) // file should be created. 
} 

Ben birim testin projede başka Ninject yapılandırma var

Ve bu IContext uygulamasının birim testinde kullanılmasını istiyorum. Ancak hala orijinal olan CommunicationDbContext uygulamasını kullanıyor. Burada, başka bir nükleer konfigürasyonum olduğunda, çekirdeğe yükleneceğime inandım, ama şimdi bir şeyi yanlış anladığımı düşünüyorum. Bana yardım edebilir misin?

+1

konu gerçekten yapıyorsun gerçeğinden kaynaklanmaktadır 'yeni StandardKernel (yeni NinjectConfig()) IContext enjekte 'CommunicationService' kurucunuzda. Bunun mantığının ne olduğu konusunda emin değilim, ancak geçerli kodla hiçbir zaman alay konusu 'IContext'i' CommunicationService''e sağlayamayacaksınız. Yapımcı Ajan kullanarak Enjeksiyon'a bakıyorum ve "IContext" in otomatik olarak "CommunicationService" e enjekte edilmesini sağlayarak testinizde alaylı bir örnek sağlayabilirsiniz. –

cevap

2

Sorun, CommunicationService yapıcısında FakeNinjectConfig yerine NinjectConfig kullanarak çekirdek oluşturmanızdır.

public class CommunicationService 
{ 
    IContext context; 

    public CommunicationService() 
    { 
     var kernel = new StandardKernel(new NinjectConfig()); 
     context = kernel.Get<IContext>(); 
    } 

basit yolu:

Sen NinjectModule veya StandardKernel bir enjekte etmek yeni bir yapıcı oluşturabilirsiniz.

public CommunicationService (StandardKernel kernel) 
{ 
    context = kernel.Get<IContext>(); 
} 

public CommunicationService(NinjectModule injectModule):this (new StandardKernel(injectModule)) 
{ 
    context = kernel.Get<IContext>(); 
} 

public CommunicationService():this (new NinjectConfig()) 
{} 

Ve testinde sen FakeNinjectConfig ile yapıcı çağırabilir.

[TestMethod] 
public void ScheduleTransportOrder_1() 
{ 
    communicationService = new CommunicationService(new FakeNinjectConfig()); 
    communicationService.SomeMethodThatUsesIContext(); 
    Assert.IsTrue(...) // file should be created. 
} 

Ya

[TestMethod] 
public void ScheduleTransportOrder_1() 
{ 
    communicationService = new CommunicationService(new StandardKernel(new FakeNinjectConfig())); 
    communicationService.SomeMethodThatUsesIContext(); 
    Assert.IsTrue(...) // file should be created. 
} 

Uygun yolu:

Ama benim açımdan içinde, sen bağımlılık olarak IContext ekleyip CommunicationService çözme IContext enjekte edilmelidir.

public class CommunicationService 
{ 
    IContext context; 

    public CommunicationService(IContext _context) 
    { 
     context = _context; 
    } 

Ve sonra, oluştururken bir CommunicationService çekirdeğin Get yöntemini yerine new operatörü kullanmalıdır. Örneğin, yerine communicationService = new CommunicationService() size communicationService = Kernel.Get<CommunicationService>();

[TestMethod] 
public void ScheduleTransportOrder_1() 
{ 
    var testKernel = new StandardKernel(new FakeNinjectConfig()); 
    communicationService = testKernel.Get<CommunicationService>(); 
    communicationService.SomeMethodThatUsesIContext(); 
    Assert.IsTrue(...) // file should be created. 
} 

kullanmalıdır Yoksa doğrudan

[TestMethod] 
public void ScheduleTransportOrder_1() 
{ 
    communicationService = new CommunicationService(new FakeDbContext()); 
    communicationService.SomeMethodThatUsesIContext(); 
    Assert.IsTrue(...) // file should be created. 
}