2012-12-10 16 views
5

Sono nuovo di Moq e test delle unità. Ho fatto una prova di unità e questo è il seguente codice:Interfacce di test unità con Moq

private Mock<IServiceAdapter> repository; 

    [TestInitialize] 
    public void Initialize() 
    { 
     repository= new Mock<IServiceAdapter>(); 
    } 

[TestMethod()] 
    public void SaveTest() 
    { 
     //Setup 
     string Name = "Name1"; 
     string Type = "1"; 
     string parentID = null; 

     repository.Setup(x => x.Save(Name , Type, parentID)).Returns("Success").Verifiable(); 

     //Do 
     var result = repository.Object.Save(Name , Type, parentID); 
     //Assert 
     repository.Verify(); 
    } 

Il mio problema è che il test restituisce sempre la stringa che ho messo nel parametro restituisce, in altre parole, sarà sempre tornare "successo "o qualunque cosa scrivo al suo posto. Immagino che non è giusto perché questo non è il vero comportamento del servizio. Qualcuno sa come posso rispecchiare il comportamento reale del servizio "Salva" che sto provando a testare? Quindi, diciamo, se la stringa di restituzione è diversa dal metodo di servizio, il test dovrebbe fallire.

cura

L'interfaccia ServiceAdapter il suo solo un wrapper per un servizio Web che io chiamo come un servizio REST. È un progetto Web Forms.

che sto facendo qualcosa di simile in questo post

How to mock a web service

Devo creare qualcosa di simile a un FakeController con Dependency Injection per farlo funzionare?

risposta

11

Qui stai testando simulazioni, che non ti danno nulla (perché questo simulato non è usato nella tua vera applicazione). Nei test unitari dovresti creare e testare i tuoi oggetti reali, che esistono nella tua vera applicazione (cioè le implementazioni dell'interfaccia). Mazze usate per deridere le dipendenze degli oggetti sotto test.

Quindi, mock of service adapter sarà utile per i test di oggetto, che utilizza tale adattatore, ad es. alcuni test del controller:

private FooController _controller; // object under test, real object 
private Mock<IServiceAdapter> _serviceAdapter; // dependency of controller 

[TestInitialize] 
public void Initialize() 
{ 
    _serviceAdapter = new Mock<IServiceAdapter>(); 
    _controller = new FooController(_serviceAdapter.Object); 
} 

[TestMethod()] 
public void SaveTest() 
{ 
    // Arrange 
    string name = "Name1"; 
    string type = "1"; 
    string parentID = null; 

    _serviceAdapter.Setup(x => x.Save(name , type, parentID)) 
        .Returns("Success").Verifiable(); 

    // Act on your object under test! 
    // controller will call dependency 
    var result = _controller.Bar(name , type, parentID); 

    // Assert 
    Assert.True(result); // verify result is correct 
    _serviceAdapter.Verify(); // verify dependency was called 
} 
+0

Mi manca qualcosa qui. Non ho un controller (sono moduli web). Metterò ulteriori informazioni nella domanda. –

+0

@MorganSoren controller è stato solo un esempio. Potrebbe essere qualsiasi altra classe che utilizza il tuo adattatore di servizio. Penso che i moduli web non siano molto testabili come lo sono, di solito è un pattern MVP utilizzato per creare applicazioni di moduli web testabili. –

+0

@MorganSoren qui è una domanda su [unit-testing web forms] (http://programmers.stackexchange.com/questions/116089/is-is-possible-to-unit-test-a-web-forms-site) –

Problemi correlati