我有以下课程(删除了相关部分)......
public class XElementComparer : IEqualityComparer<XElement>
{
private readonly string m_nodeNameToCompare;
public XElementComparer(string nodeNameToCompare)
{
m_nodeNameToCompare = nodeNameToCompare;
}
public int GetHashCode(XElement element)
{
// Returns value of attribute. Returns null if attribute does not exist.
string value = element.GetNullableAttrText(m_nodeNameToCompare);
return value == null ? element.GetHashCode() : value.GetHashCode();
}
}
我想编写一个单元测试来测试这个方法,但是GetHashCode
在每次调用时返回一个不同的值,所以我试图使用Microsoft Fakes模拟GetHashCode
(我在VS 2012中)
我无法弄清楚如何做到这一点。我已经尝试为对象类创建一个Shim for XElement和一个Stub但是无法弄清楚如何将两者绑定在一起。我是在尝试做一些不可能的事情,还是我只是错过了一些东西?
这是我的单元测试代码......
// Arrange
const int expected = 12345;
const string nodeName = "guid";
using (ShimsContext.Create())
{
// ---------------------------------------------------------------------
// Need to figure out how to mock out GetHashCode of the XElement class
// ---------------------------------------------------------------------
StubObject o = new StubObject();
o.GetHashCode01 = () => expected;
ShimXElement element = new ShimXElement();
//element.Bind(o);
// Act
XElementComparer target = new XElementComparer(nodeName);
int actual = target.GetHashCode(element);
// Assert
Assert.AreEqual(expected, actual);
}
}
更新
我解决了我的问题,但没有回答我原来的问题,所以我只是将我的解决方案添加到原始问题,以防其他人有解决方案。我最终解决了这个问题而没有嘲笑任何对象。这是“duh”时刻之一,而不是针对硬编码值设置期望值,而不是GetHashCode
的结果。
// Arrange
const string nodeName = "guid";
XElement element = new XElement("Record");
int expected = element.GetHashCode();
// Act
XElementComparer target = new XElementComparer(nodeName);
int actual = target.GetHashCode(element);
// Assert
Assert.AreEqual(expected, actual);
然后测试其他条件......
// Arrange
const string nodeName = "guid";
string attributeValue = Guid.NewGuid().ToString();
XElement element = new XElement("Record", new XAttribute(nodeName, attributeValue));
int expected = attributeValue.GetHashCode();
// Act
XElementComparer target = new XElementComparer(nodeName);
int actual = target.GetHashCode(element);
// Assert
Assert.AreEqual(expected, actual);
它并不理想,因为它没有模拟GetNullableAttrText扩展方法,但是,恕我直言,它比使用Fakes更清晰。