次のクラスがあります(無関係な部分は削除されています)...
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 を作成しようとしましたが、2 つをバインドする方法がわかりません。不可能なことをしようとしているのですか、それとも単に何かを見逃しているだけですか?
これが私の単体テストコードです...
// 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);
}
}
アップデート
私は自分の問題を解決しましたが、元の質問には答えなかったので、他の誰かが解決策を持っている場合に備えて、元の質問に自分の解決策を追加しています。オブジェクトをモックすることなく問題を解決することになりました。ハードコードされた値に対して期待値を設定するのではなく、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 を使用するよりもクリーンです。