2015-07-03 4 views
1

Я использую Nunit тестирование с Rhino mock для тестирования кода. Я столкнулся с следующей ситуацией и могу посоветовать мне справиться с такой ситуацией.Управление выходом частного метода при модульном тестировании

public bool IsValidFile() 
{ 
    ... 
    ... 
    if(IsValidCheksum(x, y)) 
    { 
     ... 
    } 
    else 
    { 
     ... 
    } 
} 

private bool IsValidCheksum(string pathTofile, string receivedChecksum) 
{ 
} 

Когда я блок тестирования IsValidFile() метод, который я хочу, чтобы проверить оба сценария, где, если условие выполнено. но поскольку я не могу управлять обработкой метода IsValidCheksum, он всегда возвращает false. Я не могу проверить истинный сценарий.

Есть ли способ принудительно вернуть значение этого метода.

+6

Вы обнаружили класс, скрывающийся внутри класса. Извлеките его, сделайте его зависимым, издевайтесь над ним. Контрольная работа. –

ответ

-1

Вы можете использовать отражение.

public static object InvokeMethod(object obj, string name, object[] parameters) 
    { 
     var method = obj.GetType().GetMethod(name, BindingFlags.NonPublic | BindingFlags.Instance); 
     return method.Invoke(obj, parameters); 
    } 

Вы можете назвать свой метод в единичном тесте:

[Test] 
public void TestMethod() 
{ 
    var test = new YourClass(); 
    test.IsValidFile(); 
    bool isValid = TestHelper.InvokeMethod(test, "IsValidCheksum", "pathTofile", "receivedChecksum"); 
    Assert.That(isValid, Is.True); 
} 
2

Я вижу 3 способа вы можете заставить IsValidCheksum, чтобы вернуть значение, которое вы хотите в единичном тесте

  1. Mock некоторые зависимости, используемые в IsValidCheksum, чтобы метод возвращал значение, которое вы хотите
  2. Сделать метод IsValidCheksum виртуальным и защищенным - таким образом, вы п дразнить его с насмешливой рамкой, как это:

    protected virtual bool IsValidCheksum(string pathTofile, string receivedChecksum) 
    

    Также Вы можете установить IsValidCheksum быть внутренняя защита виртуальные:

    internal protected virtual bool IsValidCheksum(string pathTofile, string receivedChecksum) 
    

    и установить проект, содержащий ваш класс так, что внутренности будут открыты для ваших проект единичных тестов. Для этого в файл AssemblyInfo.cs атрибута надстройки:

    [assembly: InternalsVisibleTo("UnitTestProjectName")] 
    

    Таким образом, ваш тестовый проект модуля будет иметь возможность издеваться ваш mehod в то время как для других проектов, ваш метод не будет разглашаться.

  3. Извлечь метод IsValidCheksum для разделения класса, который реализует интерфейс, определяющий IsValidCheksum, делает ваш класс зависимым от этой итерации, а в модульном тестировании используется mocked интерфейс с IsValidCheksum, возвращающим все, что вам нравится.