创建Fake对象以模拟GetHashCode

时间:2013-04-26 18:31:09

标签: c# visual-studio-2012 microsoft-fakes

我有以下课程(删除了相关部分)......

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更清晰。

0 个答案:

没有答案