2012-04-24 78 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; } 
}