我有以下界面+类:
public interface IIdentifier
{
object ID { get; set; }
}
public class IntIdentifier : IIdentifier
{
public IntIdentifier() { ID = 0; }
public IntIdentifier(int initialValue) { ID = initialValue; }
public virtual object ID { get; set; }
public override bool Equals(object obj)
{
// snip
}
public override int GetHashCode()
{
// snip
}
public bool Equals(IIdentifier other)
{
// snip
}
}
我正在尝试测试第二堂课:
public class SampleClass
{
public SampleClass(IIdentifier a, IIdentifier b)
{
A = a;
B = b;
}
IIdentifier A { get; set; }
IIdentifier B { get; set; }
public bool CheckEqualityEquals()
{
return A.Equals(B);
}
}
我想使用Rhino Mocks进行单元测试SampleClass
(假设Equals
已经过测试并且有效):
[TestMethod]
public void TestClassPerformingEqualityInternallyWithStubs()
{
var a = MockRepository.GenerateStub<IIdentifier>();
var b = MockRepository.GenerateStub<IIdentifier>();
a.ID = 1;
b.ID = 1;
var testEqual = new SampleClass(a, b);
Assert.IsTrue(testEqual.CheckEqualityEquals());
}
[TestMethod]
public void TestClassPerformingEqualityInternallyWithRealObjects()
{
var a = new IntIdentifier(1);
var b = new IntIdentifier(1);
var testEqual = new SampleClass(a, b);
Assert.IsTrue(testEqual.CheckEqualityEquals());
}
使用模拟(TestClassPerformingEqualityInternallyWithStubs
)的测试失败。原因似乎很简单:因为传递给SampleClass
的实际对象是CastleProxy
个对象,Equals
的{{1}}实现将不会被调用,我们' ll得到对象等于。
如何解决这个问题并不是那么清楚(至少对我而言)。显然IntIdentifier
执行了所需的测试,但它也隐式地测试了TestClassPerformingEqualityInternallyWithRealObjects
的部分实现作为测试的一部分。
是否有处理这些情况的标准方法?想到了一些想法:
IntIdentifier
并使用SampleClass
方法调用此对象进行实际比较(轻微的代码味道 - 我只是为了支持测试框架而注入它) )