Как утверждать закрытый метод на конкретный класс называется (TypeMock / NMock / и т.д ..)? - PullRequest
1 голос
/ 01 марта 2010

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

Ответы [ 2 ]

3 голосов
/ 01 марта 2010

попробовать Isolate.NonPublic.WhenCalled (объект, "непубличный метод"). IgnoreCall

или Isolate.Verify.NonPublic.WasCalled (объект, "метод" ..

0 голосов
/ 01 марта 2010

RhinoMocks имеет метод AssertWasCalled, который может служить для гарантии того, что метод вызывает другой метод ... но я не уверен, что вы можете сделать это с частной функцией того же класса вы юнит тестирование Я думаю, что вы могли бы сделать это только в том случае, если два метода, которые вы хотите заглушки, были в другом классе зависимостей, который был внедрен.

...