2012-04-24 40 views
8

Vì vậy, tôi đang cố gắng trả về một kiểu giả lập từ một kiểu Mocked khác, tôi đã thực hiện một số tiến bộ nhưng tôi bị kẹt ở đây (tên giao diện đã được đơn giản hóa)Giả lập một kiểu trả về từ một kiểu Mocked khác bằng cách sử dụng Moq

Xem xét giao diện IFoo và IFooItem. Calling Thêm vào một loại IFoo, đi qua trong một Ibar trả về một IFooItem

interface IFoo 
{ 
    IFooItem Add(IBar bar); 
} 

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

Ngoài ra tôi có một IFooRepository, mà tôi đang cố gắng để sử dụng Moq để chế nhạo vì vậy tôi có thể thử thêm một mục.

Vì vậy,

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

Tôi có thể nói không làm điều này. Tạo phụ thuộc giữa các đối tượng giả lập có vẻ không khôn ngoan. Chỉ cần mô tả một cách rõ ràng và thiết lập các thuộc tính được tham chiếu bởi lớp dưới thử nghiệm của bạn. Nếu 'IFooItem.Property2' và' IBar.SomeProp' luôn giống nhau, thì chỉ cần đặt chúng giống nhau. – bhamlin

Trả lời

8

Something như thế này nên làm việc:

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

này giả định rằng IBar trông như thế này:

public interface IBar 
{ 
    int Id { get; set; } 
} 
Các vấn đề liên quan