1

我正在尝试为下面的类中的“IsUnique”函数编写一个单元测试,如下所示:

class Foo
{
    public bool IsUnique(params...)
    {
       ValidateStuffExists(params);
       return CheckUniqueness(params);
    }

    private void ValidateStuffExists(params)
    {
      //does some validation
    }

    private bool CheckUniqueness(params)
    {
       //does logic to determine if its unique per params
       return result;
    }

}

我在这里唯一要测试的是 ValidateStuffExists 和 CheckUniqueness 被调用并传递了参数。这就是这个函数所做的一切,所以这就是我要测试的全部内容(我将弯曲“仅测试公共行为”伪规则并在这里测试私有方法,因为它要么有一个大的复杂方法/测试,要么测试 2 个私有方法)。

我对任何模拟库都持开放态度。我使用 NMock 并且认为它不适合任务 - 所以我下载了 TypeMock,因为我已经阅读并听说这是最好的,它甚至可以模拟具体的类/非接口方法调用......

我在我的测试中做了这样的事情,它在“Isolate.WhenCalled”行抛出异常:

        CrmEntityUniqueValidator_Accessor target = new CrmEntityUniqueValidator_Accessor(); // TODO: Initialize to an appropriate value
        DynamicEntity entity = null; // TODO: Initialize to an appropriate value
        string[] propertyNames = null; // TODO: Initialize to an appropriate value

        bool tru = true;
        Isolate.WhenCalled(() => target.CheckUniqueness(entity, propertyNames, null, null)).WillReturn(tru);

        target.ValidatePropertiesExist(entity, propertyNames);

        Isolate.Verify.WasCalledWithArguments(() => target.ValidatePropertiesExist(entity, propertyNames));
        Isolate.Verify.WasCalledWithArguments(() => target.CheckUniqueness(entity, propertyNames, null, null));

这会引发类似“*** WhenCalled 不支持使用方法调用作为参数”的异常。

即使我可以用 CLR 类做同样的事情 - 我可以模拟 DateTime.Now 这样做(代码有效):

        DateTime endOfWorld = new DateTime(2012, 12, 23);
        Isolate.WhenCalled(() => DateTime.Now).WillReturn(endOfWorld);
        DateTime dt = DateTime.Now;

        Assert.AreEqual(dt, endOfWorld);

有人在这里有什么建议吗?我是否必须将这两种方法拆分为一个单独的类并制作一个接口是唯一的方法?或使我的方法/测试复杂化???这里一定有什么我想念的东西......非常感谢您提前提供的任何帮助。

编辑:我想我正在尝试为一个单元测试模拟类中的 2 个私有方法。我怎么能做到这一点而不必将这两种方法分成一个单独的类/接口?

4

2 回答 2

3

尝试 Isolate.NonPublic.WhenCalled(object,"nonpublic method").IgnoreCall

或 Isolate.Verify.NonPublic.WasCalled(object,"method"..

于 2010-03-01T20:42:30.237 回答
0

RhinoMocks 的AssertWasCalled方法可以保证一个方法调用另一个方法……但我不确定你是否可以在你正在单元测试的同一个类的私有函数上做到这一点。我认为只有当您想要存根的两个方法位于另一个注入的依赖类中时,您才能这样做。

于 2010-03-01T20:31:29.030 回答