模拟从 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 类 实现 IBuildingZone
和 IBuildingZones
所以我可以像这样使用它们:
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);
我目前正在测试一种方法,该方法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 类 实现 IBuildingZone
和 IBuildingZones
所以我可以像这样使用它们:
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);