Domanda

.NET Framework:2.0 Lingua Preferita:C#

Sono nuovo di TDD (Test Driven Development).

Prima di tutto, è anche possibile test di unità di Servizio di Windows?

Servizio di Windows classe è derivata da ServiceBase, che è possibile eseguire l'override di metodi,

  1. OnStart
  2. OnStop

Come posso attivare quei metodi per essere chiamato come se l'unità di test è un vero e proprio servizio che chiama i metodi in modo corretto?

A questo punto, sto anche facendo un test di Unità?o un test di Integrazione?

Ho guardato il servizio WCF domanda, ma non ha alcun senso per me, dal momento che non ho mai affrontato con servizio WCF.

È stato utile?

Soluzione

Probabilmente sarei consiglia di progettare la vostra applicazione in modo che il "OnStart" e "OnStop" sostituzioni nel Servizio di Windows basta chiamare metodi di una classe biblioteca dell'assemblea.In questo modo è possibile automatizzare i test di unità contro la libreria di classi di metodi, e anche il design abstract tua logica di business dalla realizzazione di un Servizio di Windows.

In questo scenario, un test di "OnStart" e "OnStop" metodi di se stessi in un Servizio di Windows contesto, quindi, sarebbe un test di integrazione, non qualcosa che si potrebbe automatizzare.

Altri suggerimenti

Ho testato i servizi di windows non testare il servizio direttamente, ma piuttosto la prova che il servizio fa.

In genere io creare un assembly per il servizio e l'altro per la funzione del servizio.Poi ho scrivere unit test contro la seconda assemblea.

La cosa bella di questo approccio è che il servizio è molto sottile.Fondamentalmente non fa altro che chiamare i metodi per fare il lavoro giusto al momento giusto.Il tuo assembly contiene tutta la carne che il servizio intende fare.Questo rende molto facile da testare e facile da riutilizzare o modificare come necessario.

Vorrei iniziare qui.Essa mostra come avviare e interrompere i servizi in C#

Un esempio per iniziare è

public static void StartService(string serviceName, int timeoutMilliseconds)
{
  ServiceController service = new ServiceController(serviceName);
  try
  {
    TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);

    service.Start();
    service.WaitForStatus(ServiceControllerStatus.Running, timeout);
  }
  catch
  {
    // ...
  }
}

Ho provato anche servizi per lo più attraverso la console di app, simulando ciò che il servizio avrebbe fatto.Che il mio modo di test di unità è completamente automatizzato.

Vorrei utilizzare il servizio di windows classe (quella che si corre quando si avvia/arresta il servizio) come una sorta di proxy per il sistema reale.Non vedo come il codice dietro il servizio dovrebbe essere diverso da qualsiasi programmazione.OnStart e onStop metodi sono semplicemente eventi di essere licenziato, come spingere un pulsante su una GUI.

Così il servizio windows classe è molto sottile e di classe, paragonabile a un windows form.Chiama il tuo business logica/logica di dominio, che poi fa quello che si suppone di fare.Tutto quello che dovete fare è assicurarsi che il metodo(s) che si sta chiamando nel onStart e onStop stanno funzionando come dovrebbero.Almeno questo è quello che vorrei fare ;-)

Progettare per il test è una buona strategia, come molte delle risposte indicano, raccomandando che il OnStart e OnStop metodi di stare molto sottile, delegando a oggetti del dominio.

Tuttavia, se il test non è necessario eseguire il servizio metodi per qualche motivo, è possibile utilizzare questo codice per chiamare dall'interno di un metodo di prova (chiamata OnStart in questo esempio):

serviceInstance.GetType().InvokeMember("OnStart", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, serviceInstance, new object[] {new string[] {}});

Finestra di Test del servizio di spegnimento automatico, arresto di condizioni Finestra di Test del servizio di rete scollegato, collegato Finestra di Test del servizio opzione di avvio automatico, manuale, ecc

Ragazzo probabilmente la migliore risposta.

Comunque, se si vuole veramente, si può solo invocare l'unità di prova di questi due metodo descritto da La documentazione MSDN ma, poiché essi sono protetti, è necessario utilizzare la Reflection.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top