Metodi statici di supporto in TDD

7

Sto creando un'applicazione che sarà testabile (unità + integrazione). In questa applicazione ho una classe statica FileHelper,

public static class FileHelper
{
    public static void ExtractZipFile(Stream zipStream, string location)
    {
        ..................................
    } 
    public static void CreatePageFolderIfNotExist(string directory)
    {
        .................................................
    }

    .......................................................
    .......................................................
}

Ma a causa della staticità penso che non sia verificabile. Come rendere questa classe testabile?

    
posta user960567 07.02.2013 - 10:46
fonte

2 risposte

9

Dire che non sono testabili è impreciso. Sono molto testabili, ma non sono raggirabili e quindi non sono test-friendly. Cioè, ogni volta che provi un'unità di codice che chiama questo metodo, devi testare il metodo. Se il metodo viene mai interrotto, molti test falliranno e non sarà ovvio perché.

Con questo in mente, la soluzione è abbastanza ovvia. Rendilo una classe non statica, estrai un'interfaccia con tutti i metodi e passa il tuo helper in ogni classe che ne ha bisogno, preferibilmente attraverso il costruttore e preferibilmente usando un contenitore IOC.

public class FileHelper : IFileHelper
{
    public void ExtractZipFile(Stream zipStream, string location)
    {
        ..................................
    }

    public void CreatePageFolderIfNotExist(string directory)
    {
        .................................................
    }

    .......................................................
    .......................................................
}

public interface IFileHelper
{
    void ExtractZipFile(Stream zipStream, string location);
    void CreatePageFolderIfNotExist(string directory);

    .......................................................
    .......................................................
}

public class MyClass
{
     private readonly IFileHelper _fileHelper;

     public MyClass(IFileHelper fileHelper)
     {
         _fileHelper = fileHelper;
     }
}
    
risposta data 07.02.2013 - 11:37
fonte
1

Un'alternativa alla soluzione di pdr è passare la funzione statica nella classe che la usa come delegato. Ciò gli permette di essere ancora deriso, ma riduce leggermente la quantità di codice boilerplate

//warning! code not tested
static public class FileHelper 
{
    public static void ExtractZipFile(Stream zipStream, string location)
    {
         //do stuff
    }
}

public class MyClass 
{
    public Action<Stream, string> ExtractZipFile = FileHelper.ExtractZipFile
    public void DoThing()
    {
         //stuff
         ExtractZipFile(mystream, mystring);
         //more stuff
     }
}

MyClassTest()
{
     var target = new MyClass()
     target.ExtractZipFile = (stream, loc) => MaybeVerifSomething(loc);
     target.DoThing();
     //Assert stuff
}
    
risposta data 07.02.2013 - 12:46
fonte

Leggi altre domande sui tag