我正在尝试为下面的类中的“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 个私有方法。我怎么能做到这一点而不必将这两种方法分成一个单独的类/接口?