Domanda

Sono piuttosto nuovo nel deridere, quindi questo potrebbe essere qualcosa che non sto ancora riprendendo, ma non riesco a trovare un buon esempio da nessuna parte.

Sto cercando di affermare che, per impostazione predefinita, qualsiasi classe che eredita dalla mia classe astratta creerà un'istanza di una raccolta nel costruttore. Ecco la classe astratta:

public abstract class DataCollectionWorkflow : SequentialWorkflowActivity
{
        private readonly DataSet _output = new DataSet();
        private List<DataCollectionParameter> _params = null;

        public DataCollectionWorkflow()
        {
            _params = new List<DataCollectionParameter>();   
        }

        public virtual IList<DataCollectionParameter> Parameters
        {
            get { return _params; }
            set { _params = (List<DataCollectionParameter>)value; }
        }
}

Come posso deriderlo con Rhino? Se faccio un GenerateMock<DataCollectionWorkflow> (o uno stub), il costruttore viene eseguito e il campo privato del finto & Quot; _params & Quot; viene inizializzato, ma il " Parameters " la proprietà è semplicemente nulla.

Ovviamente la sottoclasse fittizia generata sta sovrascrivendo l'implementazione della proprietà. Esiste un modo per escludere la proprietà Parameters dalla reimplementazione?

Grazie.

È stato utile?

Soluzione

Okay, l'ho capito. Chalk me up come un'altra vittima delle complessità di Rhino. Questo genere di cose mi fa venire voglia di passare a un framework più semplice, forse darò un'occhiata a MoQ.

Quindi la risposta sta usando PartialMocks. Avevo giocato brevemente con la generazione di una simulazione parziale, ma quando ho eseguito il debugger su di esso ho notato che le proprietà non erano nemmeno nulle, stavano lanciando strane eccezioni, quindi non apparivo molto più profondo. Stavo usando il tipo breve di sintassi AAA di sintassi.

Si scopre che se metto semplicemente la derisione in modalità riproduzione, il test funziona - le proprietà vengono usate così come sono (come dovrebbero essere con una derisione parziale).

Quindi ecco la risposta:

[Test]
public void ShouldCreateParameterListInConstructor()
{
      var mockRepository = new MockRepository();
      var mock = mockRepository.PartialMock<DataCollectionWorkflow>();
      using ( mockRepository.Record() )
      {

      }
      using (mockRepository.Playback())
      {
           Assert.That(mock.Parameters, Is.Not.Null, "DataCollectionWorkflow base class didn't create new param collection");
      }
}

Mi rendo conto che si tratta di un test con stato ma in realtà è un preludio più semplice ad alcuni test comportamentali che coinvolgono la proprietà in questione, quindi volevo questo caso come prerequisito. Spero che aiuti qualcuno.

Altri suggerimenti

Prova a rendere _params virtuali

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