模拟从 IList 派生的接口以将其传递给 Should().BeEquivalentTo()

Mocking an interface derived from IList to pass it to Should().BeEquivalentTo()

我目前正在测试一种方法,该方法returns IBuilding 接口的实例定义如下:

public interface IBuilding
{
    public string Name { get; set; }
    public IBuildingZones Zones { get; set; }
}

public interface IBuildingZones: IList<IBuildingZone> 
{ 
    public void SortByElevation();
}

public interface IBuildingZone
{
    public string Name { get; set; }
    public double Elevation { get; set; } 
}

测试 Name 值非常简单,但我正在努力寻找测试 Zones 包含一组给定值的最佳方法。 理想情况下,我会这样写:

    building.Zones.Should().BeEquivalentTo(
        {
            { "garage", 0 },
            { "living_room", 10 },
            { "master bedroom", -4.2 }
        }
    ); 

但这显然不能编译。

定义 IBuilding 的程序集有 public 类 实现 IBuildingZoneIBuildingZones 所以我可以像这样使用它们:

    var expectedZones = new BuildingZones
    {
        new BuildingZone("garage", 0),
        new BuildingZone("living_room", 10),
        new BuildingZone("master_bedroom", -4.2)
    };
    building.Zones.Should().BeEquivalentTo(expectedZones);

但我不太乐意使用被测程序集中的 类 来测试它,尤其是当只需要接口时。

这就是为什么我一直在寻找一种使用 Moq 框架来模拟 expectedZones 的方法,但我在尝试为此寻找精简语法时遇到了一些困难。

欢迎提出任何建议。

您可以使用匿名对象来避免使用被测类型。

var expected = new[]
{
   new { Name = "garage", Elevation = 0.0 },
   new { Name = "living_room", Elevation = 10.0 },
   new { Name = "master bedroom", Elevation = -4.2 }
};

building.Zones.Should().BeEquivalentTo(expected);