2013-10-14 21 views
5

Bu yüzden MVC4 uygulamamız için testler yapıyorum ve özellikle Controller eylemlerini test ediyorum. Başlıkta bahsettiğim gibi, test hala test verilerini döndürmek yerine servise (WCF) çarpıyor. Bu denetleyici vardır:Mocked Object Hâlâ Servis Çağrıyor

public class FormController : Controller 
{ 
    public SurveyServiceClient Service { get; set; } 
    public SurveyDao Dao { get; set; } 

    public FormController(SurveyServiceClient service = null, SurveyDao dao = null) 
    { 
     this.Service = service ?? new SurveyServiceClient(); 
     this.Dao = dao ?? new SurveyDao(Service); 
    } 

    // 
    // GET: /Form/ 

    public ActionResult Index() 
    { 
     var formsList = new List<FormDataTransformContainer>(); 
     Dao.GetForms().ForEach(form => formsList.Add(form.ToContainer())); 

     var model = new IndexViewModel(){forms = formsList}; 
     return View("Index", model); 
    } 

Ve bu DAO nesnesi kullanır:

public class SurveyDao 
{ 
    private readonly SurveyServiceClient _service; 
    private readonly string _authKey; 

    public SurveyDao(SurveyServiceClient serviceClient) 
    { 
     _service = serviceClient; 
    } 

    .... 

    public FormContract[] GetForms() 
    { 
     var forms = _service.RetrieveAllForms(); 
     return forms; 
    } 

Ve bu JustMock, GetForms üzerinde sahte() bir yardımcı sınıfında bazı test verileri döndürür kullanarak benim sınavım:

[TestClass] 
public class FormControllerTest 
{ 
    private SurveyDao mockDao; 
    private SurveyServiceClient mockClient; 

    public FormControllerTest() 
    { 
     mockClient = Mock.Create<SurveyServiceClient>(); 
     mockDao = Mock.Create<SurveyDao>(mockClient); 
    } 

    [TestMethod] 
    public void TestIndexAction() 
    { 
     //Arrange 
     var controller = new FormController(mockClient, mockDao); 
     Mock.Arrange(() => mockDao.GetForms()).Returns(TestHelpers.FormContractArrayHelper); 

     //Act 
     var result = controller.Index() as ViewResult; 

     //Assert 
     Assert.IsInstanceOfType(result.Model, typeof(IndexViewModel)); 
    } 
} 

Sorunum şu ki, testi çalıştırdığımda Hizmet hala aranıyor. Fiddler'ı kullanarak testin hatalarını ayıklamak ve servisimizin test verileriyle dolu olan "sonuç" değerini incelemek için bunu doğruladım.

DÜZENLEME: Test şimdi şöyle görünür yüzden, bir [TestInitialize] fonksiyonu olacak şekilde deney yapıcısı değiştirdik

: JustMock manual açıklar

[TestClass] 
public class FormControllerTest 
{ 
    private SurveyDao mockDao; 
    private SurveyServiceClient mockClient; 

    [TestInitialize] 
    public void Initialize() 
    { 
     mockClient = Mock.Create<SurveyServiceClient>(); 
     mockDao = Mock.Create<SurveyDao>(Behavior.Strict); 
    } 

    [TestMethod] 
    public void TestIndexAction() 
    { 
     //Arrange 
     var controller = new FormController(mockClient, mockDao); 
     Mock.Arrange(() => mockDao.GetForms()).Returns(TestHelpers.FormContractArrayHelper); 

     //Act 
     var result = controller.Index() as ViewResult; 

     //Assert 
     Assert.IsInstanceOfType(result.Model, typeof(IndexViewModel)); 
    } 
} 
+1

GetForms sanal bir yöntem olmamalıdır? – rla4

+0

@ rla4, neden böyle diyorsunuz? Alaylanmış yöntemler sanal mı olmalı? – mam8cc

+1

Bu bağlıdır. Ben JustMock aşina değilim, ama birçok alay çerçeveleri sanal yöntemler gerektirebilir dynamix proxying dayanmaktadır :) – rla4

cevap

3

Lütfen JustMock için doğru montajı kullandığınızı doğrulayın. Birkaç farklı var (VisualBasic, Silverlight, JustMock).JustMock, projenizde olması gereken tek şey.

Doğru olanı belirtmemeniz, tanımladığınız davranışa neden olacaktır (yöntem uygun şekilde stubbed edilmemiştir).

1

(bana göre vurgular) : varsayılan Telerik JustMock By

gevşek mocks kullanıyorsa veçağrı sağlarBelirli bir türde herhangi bir yöntem. metodu, şeklinde ayarlanmış olsun ya da olmasın, onu arayabilirsin. Mock sizin Create() yöntemini çağrılırken

Bu davranışı denetleyebilirsiniz: Orada

var foo = Mock.Create<IFoo>(Behavior.Strict); 

Eğer açıkça belli yöntemi etkin değilse sahte nesne ne yapması gerektiğini belirtebilir. Sizin durumunuzda (varsayılan davranış olduğunu düşünüyorum) alay aslında alay etmek istediğiniz nesneye özgün yöntemi çağırır.

Sen Behavior Enumeration numaralandırma seçenekleri aşağıdadır:

  • Gevşek: Açıkça kurulum sürece varsayılan olarak sahte aramalar, bir saplama davranacağını belirtir.
  • RecursiveLoose: Açıkça ayarlanmadığı sürece varsayılan aramaların sahte nesneleri döndüreceğini belirtir.
  • Sıkı: Açık olarak ayarlanmadığında, sahte üzerinde yapılan çağrıların bir istisna atacağını belirtir.
  • CallOriginal: Varsayılan olarak, bazı beklentiler ayarlanmadığı sürece, sahte olarak yapılan tüm çağrıların karşılık gelen orijinal üyeyi çağırdığını belirtir.
+0

Sıkı bir davranışa sahip olması için alayı değiştirdim ve Hizmet hala çağrılıyor. 'mockDao = Mock.Create (Behavior.Strict); – mam8cc

+1

@ mam8cc: [' [TestInitialize()] '] eklemeye çalışın (http://msdn.microsoft.com/en-us/library/microsoft .visualstudio.testtools.unittesting.testinitializeattribute.aspx) yöntemini kullanın ve 'mockClient 've' mockDao 'ifadelerini' FormControllerTest() 'kurucusunun yerine taşıyın. Bu bir fark yaratıyor mu? –

+0

Ne yazık ki, öyle değil. Aynı sonuç. Biraz fazladan bilgi olarak, SurveyDao'ın bir sahtekarlığa ayarlandığından emin olmak için hata ayıklama yoluyla doğruladım. – mam8cc

İlgili konular