2012-04-24 50 views
8

所以我想從另一個嘲笑類型返回嘲笑類型返回類型,我已經取得了一些進展,但我堅持在這裏(接口名稱已被簡化)懲戒從另一個嘲笑類型使用起訂量

考慮接口IFoo和IFooItem。調用添加上IFoo的類型,傳入的IBAR返回IFooItem

interface IFoo 
{ 
    IFooItem Add(IBar bar); 
} 

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

另外我有一個IFooRepository,這是我想要使用起訂量嘲笑,所以我可以嘲笑增加一個項目。

所以,

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

我要說不這樣做。在模擬對象之間創建依賴關係似乎不明智。只需明確地模擬並設置被測試的類所引用的屬性即可。如果'IFooItem.Property2'和'IBar.SomeProp'總是相同的話,那就把它們設置成相同的。 – bhamlin 2012-04-25 00:00:27

回答

8

像這樣的東西應該工作:

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

這假定IBar看起來是這樣的:

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