Я пытаюсь написать модульный тест для функции 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 метода на отдельный класс и сделать интерфейс единственным способом? или усложнить мой метод/тесты??? Должно быть что-то, что мне здесь не хватает... Большое спасибо за любую помощь заранее.
EDIT: я думаю, что пытаюсь смоделировать 2 частных метода в классе для одного модульного теста. Как я мог сделать это, не разделяя эти 2 метода на отдельный класс/интерфейс?