使用Moq模拟另一个被模拟类型的返回类型

13

我正在尝试从另一个模拟类型返回一个模拟类型,我已经取得了一些进展,但现在被卡住了(接口名称已简化)

考虑接口IFoo和IFooItem。调用IFoo类型的Add方法,将IBar传递给它,会返回一个IFooItem。

interface IFoo
{
   IFooItem Add(IBar bar);
}

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

我还有一个IFooRepository,我想使用Moq来模拟它,以便我可以模拟添加一个项目。

所以,

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

我会说不要这样做。在模拟对象之间创建依赖关系似乎是不明智的。只需显式地模拟和设置被测试类引用的属性即可。如果 IFooItem.Property2IBar.SomeProp 总是相同的,那么就将它们设置为相同的值。 - bhamlin
1个回答

16

像这样应该可以:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接