我有以下课程(删除了不相关的部分)...
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
每次调用都会返回一个不同的值,所以我试图GetHashCode
使用 Microsoft Fakes 进行模拟(我在 VS 2012 中)。
我不知道该怎么做。我尝试为 XElement 创建一个 Shim,为对象类创建一个 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 更干净。