Domanda

Beffardo classi chiuse può essere un dolore.Attualmente sono a favore di un Adattatore modello per gestire questo, ma qualcosa continua si sente strano.

Quindi, Qual è il miglior modo per deridere classi chiuse?

Java risposte sono più che benvenuti.Infatti, vorrei anticipare che la comunità Java ha avuto a che fare con questo di più e ha molto da offrire.

Ma qui sono alcuni dei .NET opinioni:

È stato utile?

Soluzione

La mia regola generale è che gli oggetti che ho bisogno di deridere dovrebbe avere un'interfaccia comune troppo.Penso che questo è giusto design-saggio e fa le prove molto più facile (e di solito è quello che si ottiene se si TDD).Più di questo può essere letto in Test Google Blog post più recente (Vedi punto 9).

Inoltre, ho lavorato principalmente in Java negli ultimi 4 anni e posso dire che posso contare su una mano il numero di volte in cui ho creato un finale (sigillato) di classe.Un'altra regola è che mi dovrebbero avere sempre un buon motivo per sigillare una classe, rispetto alla tenuta di default.

Altri suggerimenti

Per .NET, è possibile utilizzare qualcosa di simile TypeMock, che utilizza la profilazione API e consente di collegare in chiamate a quasi nulla.

Credo che Talpe, da Microsoft Research, ti permette di farlo.Dalle Talpe pagina:

Talpe possono essere utilizzati per qualsiasi deviazione .NET metodo, anche per i non-virtuale/statico metodi sigillato tipi.

AGGIORNAMENTO: c'è un nuovo quadro chiamato "Falsi" per la prossima VS 11 comunicato che è stato progettato per sostituire le Talpe:

Il Falsi Quadro in Visual Studio 11 è la prossima generazione di Moli & Stub, ed eventualmente sostituirlo.Falsi è diverso da Talpe, tuttavia, in modo che lo spostamento da Talpe di Falsi richiederà alcune modifiche al codice.Una guida per la migrazione sarà disponibile in una data successiva.

Requisiti:Visual Studio 11 Ultimate .NET 4.5

Il problema con TypeMock è che si scusa il cattivo design.Ora, so che spesso è qualcun altro di cattivo design che nasconde, ma permettendo nel processo di sviluppo può portare molto facilmente per permettere proprio male disegni.

Penso che se avete intenzione di utilizzare un beffardo quadro, è necessario utilizzare una tradizionale (come Moq) e creare uno strato di isolante in tutto il unmockable cosa, e mock lo strato isolante, invece.

Ho quasi sempre evitare di avere dipendenze da classi esterne nel profondo del mio codice.Invece, mi piacerebbe molto di più l'utilizzo di un adattatore/ponte di parlare con loro.In quel modo, ho a che fare con la mia semantica, e il dolore di traduzione è isolato in una classe.

Rende anche più facile per passare il mio dipendenze nel lungo periodo.

Mi sono imbattuto in questo problema di recente, e dopo la lettura / ricerca web, sembra che non vi è alcun modo semplice di tutto tranne che di utilizzare un altro strumento di cui sopra.O grezzo di gestire le cose come ho fatto io:

  • Creare l'istanza della classe chiusa senza ottenere costruttore chiamato.
  • Sistema.Runtime.La serializzazione.FormatterServices.GetUninitializedObject(instanceType);

  • Assegnare i valori per la proprietà del / dei campi attraverso la riflessione

  • YourObject.GetType().GetProperty("PropertyName").SetValue(dto, newValue, null);
  • YourObject.GetType().GetField("Nomecampo").SetValue(dto, newValue);

Io, di solito, il percorso di creazione di un'interfaccia e adattatore/classe proxy per facilitare beffardo del tipo sigillato.Tuttavia, ho anche sperimentato saltare la creazione dell'interfaccia e fare il tipo di proxy non sigillate con metodi virtuali.Questo ha funzionato bene quando il proxy è davvero una base naturale di classe che incapsula e gli utenti parte della classe chiusa.

Quando ha a che fare con il codice che ha richiesto questo adattamento, mi sono stancato di eseguire le stesse azioni per creare l'interfaccia e il tipo di proxy, così ho realizzato una libreria per automatizzare le attività.

Il codice è un po ' più sofisticata di quella del campione fornite nell'articolo si fa riferimento, in quanto produce un'assemblea (invece di codice sorgente), permette la generazione di codice per essere eseguita su qualsiasi tipo, e non richiede molto di configurazione.

Per ulteriori informazioni, si prega di consultare questa pagina.

E ' perfettamente ragionevole per deridere una classe chiusa perché molte classi del framework sono sigillati.

Nel mio caso sto cercando di finto .Net classe MessageQueue in modo che io possa TDD mio grazioso logica di gestione delle eccezioni.

Se qualcuno ha idee su come superare Moq errore in materia di "installazione non Valido non sostituibile membro", per favore fatemelo sapere.

codice:

    [TestMethod]
    public void Test()
    {
        Queue<Message> messages = new Queue<Message>();
        Action<Message> sendDelegate = msg => messages.Enqueue(msg);
        Func<TimeSpan, MessageQueueTransaction, Message> receiveDelegate =
            (v1, v2) =>
            {
                throw new Exception("Test Exception to simulate a failed queue read.");
            };

        MessageQueue mockQueue = QueueMonitorHelper.MockQueue(sendDelegate, receiveDelegate).Object;
    }
    public static Mock<MessageQueue> MockQueue
                (Action<Message> sendDelegate, Func<TimeSpan, MessageQueueTransaction, Message> receiveDelegate)
    {
        Mock<MessageQueue> mockQueue = new Mock<MessageQueue>(MockBehavior.Strict);

        Expression<Action<MessageQueue>> sendMock = (msmq) => msmq.Send(It.IsAny<Message>()); //message => messages.Enqueue(message);
        mockQueue.Setup(sendMock).Callback<Message>(sendDelegate);

        Expression<Func<MessageQueue, Message>> receiveMock = (msmq) => msmq.Receive(It.IsAny<TimeSpan>(), It.IsAny<MessageQueueTransaction>());
        mockQueue.Setup(receiveMock).Returns<TimeSpan, MessageQueueTransaction>(receiveDelegate);

        return mockQueue;
    }

Anche se attualmente è disponibile solo in versione beta, penso che vale la pena di tenere a mente le shim caratteristica del nuovo Falsi quadro (parte del Visual Studio 11 Versione Beta).

Shim tipi fornire un meccanismo per la deviazione alcuna .NET metodo definito dall'utente delegato.Shim tipi di codice generato da Falsi generatore, e delegati, che noi chiamiamo spessore tipi, per specificare le nuove implementazioni del metodo.Sotto il cofano, il supporto dei tipi di callback che sono stati iniettati in fase di runtime nel metodo MSIL corpi.

Personalmente stavo guardando per prendere in giro i metodi sigillato classi del framework come DrawingContext.

C'è un modo per implementare una classe chiusa da un'interfaccia...e mock l'interfaccia, invece?

Qualcosa in me si sente che suggellò classi è sbagliato, in primo luogo, ma che solo a me :)

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