2012-08-03 15 views
8

Bu WebAPI projesi üzerinde çalışıyorum ve bunun için birim testleri oluşturmam gerekiyor. Projenin tabanı VS 2010 kullanılarak oluşturuldu ve ardından bir WebApi Modülü eklendi.C# WebApi Ünitesi Test ve Alay Denetleyicileri

Kontrol ünitesinin çalışmaları test/alay etme yolunda ilerliyor. XUnit ve Moq kullanıyorum, ancak bu ikisi ile kesinlikle uğraşmaya gerek yok.

uygulama veritabanı erişimi ile başa çıkmak için belirli nesneleri kullanır, bu yüzden controllerObject var ve bunun contructor DataAccessObject

Ben kontrolör/DataAccess çifti alay ile sorun yaşıyorum gerektirir. Çalıştırmaya çalıştığım ilk test bir GetAllFromDataBase'tir, ancak gerçekten nasıl yapılacağına dair bir ipucum yok.

DÜZENLEME: Cuong Le söyledi ve bütün artık hareket ediyor ne yaptı

, gerçekten apreciate. Ama başka bir problemle karşılaştım. API'ye erişmek için bir kullanıcı adı/şifre çifti var ve denetleyicim Thread.CurrentPrincipal.Identity.Name; Şu anda bu değeri tam olarak çalışmam için tahmin etmem gerekecek. Ayrıca

valueServiceMock.Setup (hizmet => service.GetValues ​​()) .Returns (yeni [] { "deger1", "deger2"});

çalışmıyor gibi görünmektedir. kod veritabanına ulaşmaya çalıştığında ve

+0

Sen denetleyici alay etmesin, sen dalga geçeyim kontrolörün ihtiyaç duyduğu hizmetler. Eğer kontrolöre alay olsaydınız, kontrolörü test etmezdiniz. Bütün nokta bu. Bu gönderiye bir göz atın: http://www.peterprovost.org//blog/2012/06/16/unit-testing-asp-dot-net-web-api/ – tugberk

+0

Sahte nesnenin üzerinden geçtiğini kontrol ettiniz mi? Bunun gibi kurucu: var controller = new ValuesController (valueServiceMock.Object); –

cevap

18

'u aramak için geçerli bir kullanıcı adı bulamadığı için hiçbir şey almaz. Uygulamanızı test edilebilir duruma getirmek için, test edilebilirliği göz önünde bulundurmanız gerekir.Teknik olarak, test edilebilirlik için tasarım uygulamanız, katmanlar arasında, bileşenler arasında ve hatta sınıflar arasında olabildiğince gevşek birleştirme olmalıdır.

Test edilebilirlik için tasarlayacağınız bir çok ipucu: mühürlü, statik sınıftan kaçının ... Ancak, bilinmesi gereken en popüler şey, dependency injection pattern, contructors içinde nesne oluşturmak veya diğer nesnelerin metotları yerine, enjekte edilmelidir. Bu şekilde, alay çerçeveyle fake'a sınıfımız arasında kolay bir bağımlılık yaparız. Harici kaynağa bağlı olan nesneler için: ağ, dosya veya veritabanı.

Bağımlılık enjeksiyonunu kullanarak nesne nasıl enjekte edilir: bu nedenle IocContainer bunun için doğru bir araçtır, bu sizin için nesneleri otomatik olarak enjekte edecektir. Kullanmayı tercih ettiğim IoC Container: Autofac ve NInject.

public class ValuesController : ApiController 
{ 
    private readonly IValueService _valueService; 

    public ValuesController(IValueService valueService) 
    { 
     _valueService = valueService; 
    } 

    public string[] Get() 
    { 
     return _valueService.GetValues(); 
    } 

    public string Get(int id) 
    { 
     return _valueService.GetValue(id); 
    } 
} 

Ve aşağıda MOQ ile birim testine basit kodudur: Burada

Örnek ValuesController içine ValueService enjekte etmek

var valueServiceMock = new Mock<IValueService>(); 
valueServiceMock.Setup(service => service.GetValues()) 
      .Returns(new[] { "value1", "value2" }); 

var controller = new ValuesController(valueServiceMock.Object); 
var values = controller.Get(); 

Assert.AreEqual(values.Length, 2); 
Assert.AreEqual(values[0], "value1"); 
Assert.AreEqual(values[1], "value2"); 
+0

Bana anlattığın şeyi yaptım ve şimdi bütün bunlar hareket ediyor, gerçekten de apreciate ediyorum. Ama başka bir problemle karşılaştım. API'ye erişmek için bir kullanıcı adı/şifre çifti var ve denetleyicim Thread.CurrentPrincipal.Identity'yi kullanıyor.Adı; – oSR

+0

Burada çözebileceğimi umuyordum, ama sonra başka bir soru yapalım! – oSR