c# - 使用派生类时如何使用 Fluent Assertion Should().BeEquivalentTo() 检查等价性
问题描述
我在尝试让 Should().BeEquivalentTo() 处理从基类派生的类型并实现集合接口时遇到问题:
public class Entity
{
public string Id {get; set;}
public string Name {get; set;}
}
public class Derived : Entity, ICollection<Entity>
{
private List<Entity> m_Children = new List<Entity>();
public string Description { get; set; }
public int Count => ((ICollection<Entity>)m_Children).Count;
public bool IsReadOnly => ((ICollection<Entity>)m_Children).IsReadOnly;
public void Add(Entity item)
{
((ICollection<Entity>)m_Children).Add(item);
}
public void Clear()
{
((ICollection<Entity>)m_Children).Clear();
}
public bool Contains(Entity item)
{
return ((ICollection<Entity>)m_Children).Contains(item);
}
public void CopyTo(Entity[] array, int arrayIndex)
{
((ICollection<Entity>)m_Children).CopyTo(array, arrayIndex);
}
public IEnumerator<Entity> GetEnumerator()
{
return ((ICollection<Entity>)m_Children).GetEnumerator();
}
public bool Remove(Entity item)
{
return ((ICollection<Entity>)m_Children).Remove(item);
}
IEnumerator IEnumerable.GetEnumerator()
{
return ((ICollection<Entity>)m_Children).GetEnumerator();
}
}
考试
[TestMethod]
public void EquivalenceTest()
{
var expected = new Derived
{
Id = "123",
Name = "abc",
Description = "def"
};
var actual = new Derived
{
Id = "121",
Name = "xyz",
Description = "def"
};
actual.Should().BeEquivalentTo(expected); // This succeeds, but should fail
}
对 BeEquivalentTo 的调用似乎忽略了对象中定义的属性,只将对象视为一个集合。
如何让框架检查集合的属性和内容?
编辑 这似乎是一个已知问题
有谁知道解决方法?
解决方案
在比较实现并具有要比较的额外属性的类时,这是一个已知问题。IEnumerable
这是一种破解比较的方法。
public class Entity : IEnumerable<int>
{
private int[] ints = new[] { 1 };
public int Id { get; set; }
public string Name { get; set; }
public IEnumerator<int> GetEnumerator() => ((IEnumerable<int>)ints).GetEnumerator();
IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable<int>)ints).GetEnumerator();
}
[TestMethod]
public void EquivalenceTest()
{
var expected = new Entity
{
Id = 1,
Name = "abc",
};
var actual = new Entity
{
Id = 1,
Name = "abc",
};
actual.Should().BeEquivalentTo(expected, opt => opt
.Using<Entity>(e =>
e.Subject.Should().Match<Entity>(f => f.Name == e.Expectation.Name)
.And.Subject.Should().Match<Entity>(f => f.Id == e.Expectation.Id)
.And.Subject.Should().BeEquivalentTo(e.Expectation)
)
.WhenTypeIs<Entity>());
}
推荐阅读
- java - 我的 CustomDeserializer 类在同一类的第二个字段上第二次不起作用
- javascript - 将删除请求与 json 对象匹配
- node.js - Node.js:如何防止恶意图像文件上传?即,如何在 Node 中实现图像清理程序?
- r - 检索分层组织的两个列表之间的共同元素
- xamarin - 无法删除 xamarin 中堆栈布局内的帧之间的分隔
- javascript - jquery读取数据
- javascript - 如何在反应js中单击按钮或图标单击打开日期选择器
- jquery - 意外的令牌 < 试图评估 JavaScript
- lua - 脚本不会用 gsub 替换空白空间
- python - 如何设置 wfastcgi 使烧瓶服务器在生产模式下运行?