Domanda

Ho una classe holding scientifici complessi calcoli.Esso è impostato per consentire solo ad un utente di creare un correttamente creata un'istanza caso.Per verificare correttamente il codice, tuttavia, richiede la creazione di interni variabili di stato direttamente, dal momento che i documenti di riferimento per la fornitura di questo tipo di dati a loro casi di test.Fatto in modo improprio, tuttavia, può invalidare lo stato.

Quindi devo avere la possibilità, una funzione membro, per impostare le variabili interne dall'unità di programmi di test.Ma voglio fortemente scoraggiare normali utenti di chiamare questa funzione.(Sì, un determinato utente può letame con qualsiasi cosa...ma non voglio pubblicizzare che c'è un modo per fare qualcosa di sbagliato.)

Sarebbe bello essere in grado di dire Intellisense per non mostrare la funzione, per esempio.

La soluzione migliore che ho in questo momento è solo il nome della funzione di qualcosa di simile a:DangerousSet().

Quali altre opzioni ho?

Follow-Up

Ho trovato Davide, B risposta più utile per la mia situazione.Grazie!
Mufasa suggerimento di utilizzare la reflection è stato grande, ma più difficile da implementare (per me).
Chris' suggerimento di utilizzare un decoratore era buona, ma non pan fuori.
Libero suggerimento su XML è anche un bene, ed era già in uso, ma non risolve realmente il problema.

Infine, BillTheLizard suggerimento che il problema è nei documenti di origine non è qualcosa che posso controllare.Esperti internazionali pubblicare altamente tecnica, libri e articoli di giornale ad uso della loro comunità.Il fatto che non risolvono il mio particolare ha bisogno è un fatto della vita.Non vi sono documenti alternativi.

È stato utile?

Soluzione

Si supponga di voler verificare questo oggetto manipolando i suoi campi.

public class ComplexCalculation
{
    protected int favoriteNumber;
    public int FavoriteNumber
    {
        get { return favoriteNumber; }
    }
}

Posto questo oggetto nel montaggio di prova/spazio dei nomi:

public class ComplexCalculationTest : ComplexCalculation
{
    public void SetFavoriteNumber(int newFavoriteNumber)
    {
        this.favoriteNumber = newFavoriteNumber;
    }
}

E scrivere i test:

    public void Test()
    {
        ComplexCalculationTest myTestObject = new ComplexCalculationTest();
        myTestObject.SetFavoriteNumber(3);
        ComplexCalculation myObject = myTestObject;

        if (myObject.FavoriteNumber == 3)
            Console.WriteLine("Win!");

    }

PS:So che hai detto interno, ma non credo che si intende interno.

Altri suggerimenti

È possibile utilizzare InternalsVisibleToAttribute per contrassegnare i membri interni come visibili al montaggio di prova.Sembra brillare quando utilizzato in questo contesto, anche se non è molto "amico".

  1. Il tuo marchio DangerousSet funzione internal invece di public.

  2. In Proprietà\AssemblyInfo.cs del progetto contenente DangerousSet:

    [assembly:InternalsVisibleTo("YourTestAssembly")]

Se si dispone di due test di assemblee, per qualsiasi motivo, la sintassi è:

[assembly:InternalsVisibleTo("TestAssembly1"), 
    InternalsVisibleTo("TestAssembly2")]

Decora il tuo metodo con questo attributo:

[System.ComponentModel.EditorBrowsable(System.ComponentModel.EditorBrowsableState.Never)]

Questo nasconderà da Intellisense.

EDIT:

Ma a quanto pare questo è un piuttosto significativo avvertimento:"In Visual C#, EditorBrowsableAttribute non sopprimere i membri di una classe nella stessa assemblea". Via MSDN.

Sembra che il tuo vero problema è nei vostri documenti di riferimento.Non dovreste casi di test impossibile incontro con un uso corretto della classe.Se gli utenti non dovrebbe essere consentito di cambiare lo stato di tali variabili, quindi non il tuo test.

È inoltre possibile utilizzare la reflection.Ricerca Google alzato Di Unit testing privato metodi di utilizzo di riflessione.

Può il vostro codice di test includono una sottoclasse dei calcoli di classe?Se è così, è possibile contrassegnare la funzione protected e solo gli eredi saranno in grado di utilizzare.Sono abbastanza sicuro che questo prende anche fuori di intellisense, ma potrei sbagliarmi su questo.

Quello che ho fatto in passato è ho messo i Commenti XML con il metodo e utilizzato la sezione per scrivere in lettere grandi in grassetto.NON USARE QUESTO METODO o qualsiasi altra cosa.In questo modo, se qualcuno ha provato a usarlo, Intellisense vorresti dare loro una bella avviso.

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