Я пытаюсь написать модульный тест для функции 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 вызывают и передают аргументы. Это все, что делает эта функция, так что это все, что я собираюсь протестировать (я согну psuedo-правило «только тестировать публичное поведение» и протестирую здесь приватные методы, потому что у него либо один большой сложный метод / tests, либо тестирование 2 private методы).
Я открыт для любой насмешливой библиотеки. Я использую 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 метода на отдельный класс и сделать интерфейс единственным способом? или усложнить мой метод / тесты ??? Здесь должно быть что-то, чего мне не хватает ... Большое спасибо за любую помощь заранее.
РЕДАКТИРОВАТЬ: я пытаюсь смоделировать 2 частных метода в классе для одного модульного теста. Как я могу сделать это, не разбивая эти два метода на отдельный класс / интерфейс?