使用模拟参数测试相等性

时间:2013-12-23 20:09:43

标签: .net unit-testing mocking rhino-mocks

我有以下界面+类:

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的部分实现作为测试的一部分。

是否有处理这些情况的标准方法?想到了一些想法:

  1. 使用实际的实现(臭)
  2. 将处理相等性的对象注入IntIdentifier并使用SampleClass方法调用此对象进行实际比较(轻微的代码味道 - 我只是为了支持测试框架而注入它) )
  3. 在Rhino Mocks中找到一些支持以支持这种情况(我试图使用Callback,但一直无法使其工作)。
  4. 查找处理此方案的其他模拟框架

0 个答案:

没有答案