SORU
11 Temmuz 2011, PAZARTESİ


NUnit, Ninject, ve Adedi ile test etmek için öğrenmek için Nasıl?MVC 3:

Sorularıma kısa versiyon:

  1. Herkes iyi, ayrıntılı bazı kaynaklar, içinden doğru yönlendirebilirsiniz. MVC 3 uygulama testi uygulamak için nasıl, kullanarak öğrenebilirsiniz NUnit, 2 ve Adedi Ninject?
  2. Herkes burada benim için nasıl Denetleyicisi-Depo netleştirmek yardımcı olabilir ışıma, dalga geçiyor ve bağımlılık enjeksiyon birlikte çalışır?

Uzun sorularıma sürüm:

Yapmaya çalıştığım şey ...

Şu anda Varlık Çerçevesi veritabanı ilk yaklaşımlar ile 4, kullanacağı MVC 3 uygulama oluşturmaya başladım. Bu doğru, sınıfları tasarımı için çalışıyorum yani, katmanlar, vb. yapmak istiyorum son derece test edilebilir. Ancak, birim test ya da entegrasyon test ile ilgili herhangi bir deneyim, akademik bir anlayış dışında çok az var.

Araştırma çok sonra kullanmaya karar verdim

  • NUnitbenim test çerçeve olarak
  • Ninject 2bağımlılık enjeksiyon çerçeve benim gibi
  • Adedialay benim çerçeve olarak.

Ben, vb. en iyi, hangi konu olduğunu bu içine girebilir, ama bu noktada ben gerçekten sağlam bir fikir edinmek hakkında yeterince bilgimiz yok. Bu yüzden, ben de sevdim gibi görünen bu ücretsiz çözümler ile gitmeye karar verdi ve bakımlı.

Şimdiye kadar ne öğrendim ...

Bir süre bu şeyler üzerinden çalışan, kaynakları gibi okuyarak geçirdim:

Bu kaynaklardan, benim denetleyicileri ve benim veri erişim mantığı ayrıştır için Depoyu bir desen, depo arayüzleri ile komple, gerek egzersiz yapmayı başardım. Yazdım biraz içine benim uygulama zaten, ama ben kabul etmiyorum net olarak mekaniğinin her şey, ve olup olmadığını yapıyorum zaten bu ayırımı destek alaycı veya bağımlılık enjeksiyon, ya da her ikisi. Gibi, ben kesinlikle bu konuda sizden işitme de sorun olmaz. Bu şeylere sahip herhangi bir netlik bu noktada bana yardımcı olacak.

İşler benim için çamurlu aldım ...

Building Testable ASP.NET MVC Applications, yukarıda belirtilen açıklandığı gibi Ninject kendime adapte etmeye başlayana kadar oldukça iyi şeyler açgözlü olduğumu sanıyordum. Özellikle, yazarın, belgeye bir Servis katmanı, yaklaşık yarım uygulanmasını açıklayan başladığı nokta etrafında tamamen kayboldum.

Neyse, artık daha fazla kaynak için bana mantıklı gelmeye başlayana kadar çeşitli bakış açıları etrafında bunları elde etmek için çalışması için arıyorum.

Bu özetleme, belirli bir soru için aşağı kaynar, şunları merak ediyorum:

  1. Herkes iyi, ayrıntılı bazı kaynaklar, içinden doğru yönlendirebilirsiniz. MVC 3 uygulama testi uygulamak için nasıl, kullanarak öğrenebilirsiniz NUnit, 2 ve Adedi Ninject?
  2. Herkes burada benim için nasıl Denetleyicisi-Depo netleştirmek yardımcı olabilir ışıma, dalga geçiyor ve bağımlılık enjeksiyon birlikte çalışır?

DÜZENLEME:

Ben sadece Github Ninject official wiki keşfetti, eğer benim için bir şeyler açıklığa başlatır görmek ile çalışmaya başlayacağım. Ama, yine de tüm bunlar:) bu YÜZDEN toplum düşüncelerini çok merak ediyorum

CEVAP
11 Temmuz 2011, PAZARTESİ


Ninject.MVC3 nuget paketi kullanıyorsanız, o zaman karışıklığa neden olan bağlantılı makalenin bazı gerekmeyecektir. Bu paket denetleyicileri enjekte başlamalısın muhtemelen büyük acı noktası olan her şey var.

Bu paketi yükledikten sonra, bir NinjectMVC3 yaratacak.cs sınıfı RegisterServices bir yöntem içinde App_Start klasöründe dosya. Bu arayüzleri ve uygulamaları arasındaki bağlantıları oluşturmanız gerekir

private static void RegisterServices(IKernel kernel)  
{  
  kernel.Bind<IRepository>().To<MyRepositoryImpl>();
  kernel.Bind<IWebData>().To<MyWebDAtaImpl>();
}        

Şimdi kumandanız yapıcı enjeksiyon kullanabilirsiniz.

public class HomeController : Controller {  
    private readonly IRepository _Repo;
    private readonly IWebData _WebData;

    public HomeController(IRepository repo, IWebData webData) {
      _Repo = repo;
      _WebData = webData;
    }
}

Senden sonra çok yüksek test kapsamı, temelde her zaman bir mantıksal parça kodu (denetleyici) ihtiyaçlarını konuşmak için başka bir (veritabanı) oluşturma arayüzü ve uygulama, add tanımı bağlama RegisterService ve eklemek yeni bir yapıcı argüman.

Bu geçerlidir sadece kontrol, ama herhangi bir sınıf, bu yüzden yukarıdaki örnekte eğer deponuzu uygulanması gereken örneği Web için bir şeyler yapardın ekleyin salt okunur alan ve kurucu deponuzu uygulanması.

O zaman gelince test, ne istediğin sağlamak alay sürümü tüm gerekli arabirimleri, böylece tek şeysin test kodu yöntemi olan Yazılı sınav için. Yani benim örnekte, bu İRepository bir söylüyorlar

bool TryCreateUser(string username);

Bir denetleyici yöntemi olarak adlandırılır

public ActionResult CreateUser(string username) {
    if (_Repo.TryCreateUser(username))
       return RedirectToAction("CreatedUser");
    else
       return RedirectToAction("Error");
}

Ne sen gerçekten sınıyor işte, deyim ve dönüş türleri, yapmak istemiyor oluşturmak için gerçek bir depo olacak doğru veya yanlış döndürür tabanlı özel değer veriyorsunuz. Bu sahte çok fazladır.

public void TestCreateUserSucceeds() {
    var repo = new Mock<IRepository>();
    repo.Setup(d=> d.TryCreateUser(It.IsAny<string>())).Returns(true);
    var controller = new HomeController(repo);
    var result = controller.CreateUser("test");
    Assert.IsNotNull(result);
    Assert.IsOfType<RedirectToActionResult>(result)
    Assert.AreEqual("CreatedUser", ((RedirectToActionResult)result).RouteData["Action"]);
}

Biliyorum sizin için derlemek olmaz ^ daha iyi xUnit, ve kafamın üstünden RedirectToActionResult özellik adlarını hatırlamıyorum.

Eğer kod tek parça diğerine konuşmak istersen yani özetle, arasında bir arayüz vurmak. Bu ilk test ne zaman çıkış kontrolü ve soru yalnızca kodu test etmek emin olabilirsiniz bu kod, ikinci parça alay sağlar.
Gerçekten bu benim için "jeton düştü" yapan, bunu ille kodu istiyor becase, ama test gerektirdiği için bu noktada olduğunu düşünüyorum.

Son bir tavsiye belirli bir MVC, herhangi bir zaman ihtiyacınız erişim temel web nesneleri, HttpContext, HttpRequest vb, şal tüm bunların arkasında bir arabirim de (gibi İWebData benim örnek) çünkü süre alay bu kullanma *Temel sınıflar, olur acı çok çabuk da çok iç bağımlılıkları da ihtiyacımız alay.
Adedi ile de, alay oluştururken Katı için MockBehaviour ayarlayın ve eğer bir şey bir dalga için hazırladık olmayan çağrıldığını eğer size söyleyecektir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • cdgotx

    cdgotx

    8 Kasım 2011
  • Sean Murphy

    Sean Murphy

    4 ŞUBAT 2009
  • XxMinayaxX1

    XxMinayaxX1

    9 Mayıs 2012