0

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

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 更干净。

4

0 回答 0