2012-04-24 3 views
8

Così sto cercando di restituire un tipo deriso da un altro tipo deriso, ho fatto qualche progresso, ma mi sono bloccato qui (nomi di interfaccia sono state semplificate)derisione un tipo di ritorno da un altro tipo deriso utilizzando Moq

Considerare l'interfaccia IFoo e IFooItem. Chiamata Aggiungere su un tipo IFoo, passando in un IBar restituisce un IFooItem

interface IFoo 
{ 
    IFooItem Add(IBar bar); 
} 

interface IFooItem 
{ 
    int fooItemId {get; set;} 
} 

anche io ho un IFooRepository, che sto cercando di utilizzare Moq prendere in giro in modo da poter prendere in giro l'aggiunta di un elemento.

Quindi,

var mockFooRepository = new Mock<IFooRepository>(); 
mockFooRepository.Setup(m=> m.Add(It.IsAny<IBar>())) 
    .Returns(
    // What is the correct way to mock properties of a new IFooItem from 
    // mocked properties of IBar 
    // essentially a new mocked type of IFooItem that can read from IBar 
    // so IFooItem.Property = somevalue, IFooItem.Property2 = IBar.SomeProp 
    ); 
+0

direi non farlo. Creare dipendenze tra oggetti derisi sembra poco saggio. Basta fingere esplicitamente e impostare le proprietà a cui fa riferimento il sottotest della classe. Se 'IFooItem.Property2' e' IBar.SomeProp' saranno sempre gli stessi, allora impostali allo stesso modo. – bhamlin

risposta

8

Qualcosa del genere dovrebbe funzionare:

var mockFooRepository = new Mock<IFooRepository>(); 
mockFooRepository.Setup(r => r.Add(It.IsAny<IBar>())) 
    .Returns<IBar>(bar => 
    { 
     var item = new Mock<IFooItem>(); 
     item 
      .Setup(i => i.fooItemId) 
      .Returns(bar.Id); 

     return item.Object; 
    }); 

Questo presuppone che IBar assomiglia a questo:

public interface IBar 
{ 
    int Id { get; set; } 
}