2012-08-03 13 views
8

Sto lavorando a questo progetto WebAPI e ho bisogno di creare unit test per questo. La base del progetto è stata creata utilizzando VS 2010, quindi è stato aggiunto un modulo WebApi.C# WebApi Unità di controllo e controller di derisione

Il funzionamento del controller è un po 'come mettere alla prova/beffarsi. Sto usando xUnit e Moq, ma non è assolutamente necessario attenersi a questi due.

L'applicazione utilizza oggetti specifici a che fare con l'accesso al database, in modo da avere il controllerObject e la sua contructor richiede l'DataAccessObject

Sto avendo problemi con beffarda la coppia di controllo/DataAccess. Il primo test che sto cercando di eseguire è GetAllFromDataBase, ma non ho davvero un indizio su come farlo.

EDIT:

ho fatto quello che Cuong Le mi ha detto e l'intero si sta muovendo ora, ho davvero apreciate esso. Ma mi sono imbattuto in un altro problema. Per accedere all'API, esiste una coppia nome utente/password e il mio controller utilizza Thread.CurrentPrincipal.Identity.Name; in questo momento avrei bisogno di impostare questo valore affinché funzioni completamente, credo.

Anche il valoreServiceMock.Setup (service => service.GetValues ​​()) . Restituisce (nuovo [] {"valore1", "valore2"});

non sembra funzionare. come il codice tenta di raggiungere il database e non ottiene nulla dal momento che non può ottenere un nome utente valido per cercare

+0

Si consiglia di non prendere in giro il controller, si dovrebbe prendere in giro il servizi di cui il controller necessita. Se stavi prendendo in giro il controller, non avresti testato il controller. Questo è il punto. Dai un'occhiata a questo post: http://www.peterprovost.org//blog/2012/06/16/unit-testing-asp-dot-net-web-api/ – tugberk

+0

Hai controllato di passare l'oggetto mock via costruttore come questo: var controller = new ValuesController (valueServiceMock.Object); –

risposta

18

Per poter testare l'app, è necessario progettare per verificare la testabilità. Tecnicamente, progettare per testabilità , l'app dovrebbe essere il più possibile flessibile tra gli strati, tra i componenti e anche tra le classi.

Un sacco di suggerimenti per la progettazione di testabilità: Evitare sigillato, classe statica ... Ma la cosa più importante che dovete essere consapevoli è dependency injection pattern, invece di creare oggetti all'interno Case costruttrici o metodi di altri oggetti, questo oggetto dovrebbe essere iniettato In questo modo creiamo una dipendenza sproporzionata tra classe e facile per noi a falso da una struttura di derisione. Esp, per gli oggetti che dipendono da risorse esterne: rete, file o database.

Come iniettare un oggetto usando l'iniezione di dipendenza: ecco perché IocContainer è lo strumento giusto per questo, inietterà automaticamente gli oggetti per te. I contenitori IoC che preferisco usare sono: Autofac e NInject.

Esempio qui per iniettare ValueService in ValuesController:

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); 
    } 
} 

E sotto è il semplice codice di test di unità con Moq:

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

Ho fatto quello che mi hai detto e il tutto si sta muovendo ora, lo apprezzo davvero. Ma mi sono imbattuto in un altro problema. Per accedere all'API, esiste una coppia nome utente/password e il mio controller utilizza Thread.CurrentPrincipal.Identity.Nome; – oSR

+0

Speravo di poter risolvere questo problema qui, ma facciamo un'altra domanda! – oSR