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

本文关键字:模拟 模拟类 返回类型 类型 另一个 Moq 使用 | 更新日期: 2023-09-27 18:32:20

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

考虑接口 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
     );

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

这样的事情应该可以工作:

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