2012-04-24 8 views
8

Więc próbuję zwrócić szydzili z innego typu szydzili typu, jakie poczyniła pewne postępy, ale ja utknęłam tutaj (nazwy interfejsu zostały uproszczone)Mocking typ zwracanej z innego typu szydzili użyciu Moq

Rozważ interfejs IFoo i IFooItem. Dodaj na wywołanie typu IFoo, przechodząc w IBAR zwraca IFooItem

interface IFoo 
{ 
    IFooItem Add(IBar bar); 
} 

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

Również mam IFooRepository, który próbuję użyć Min drwić tak można drwić dodając element.

Więc

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

Powiedziałbym, nie rób tego. Tworzenie zależności między wyśmiewanymi obiektami wydaje się nierozsądne. Po prostu jawnie udawaj i ustaw właściwości, do których odwołuje się twój test podrzędny. Jeśli 'IFooItem.Property2' i' IBar.SomeProp' zawsze będą takie same, po prostu ustaw je tak samo. – bhamlin

Odpowiedz

8

Coś jak to powinno działać:

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; 
    }); 

ta zakłada, że ​​IBar wygląda następująco:

public interface IBar 
{ 
    int Id { get; set; } 
} 
Powiązane problemy