Убедитесь, что базовый защищенный метод вызывается с помощью Moq 3.1 - PullRequest
0 голосов
/ 07 октября 2010

У меня есть класс, который наследуется от абстрактного базового класса. Я пытаюсь проверить, что указанный защищенный метод в базовом классе вызывается дважды, и я хотел бы убедиться, что переданные параметры являются конкретными значениями (разными для каждого вызова).

Я надеялся, что смогу использовать Protected с Expect или Verify, но, похоже, я упустил, что можно сделать с помощью этих методов.

Возможно ли то, что я пытаюсь сделать с помощью moq? ​​

UPDATE: Пример того, что я пытаюсь сделать:

class MyBase
{
    protected void SomeMethodThatsAPainForUnitTesting(string var1, string var2)
    {
        //Stuf with file systems etc that's very hard to unit test
    }
}

class ClassIWantToTest : MyBase
{
    public void IWantToTestThisMethod()
    {
        var var1 = //some logic to build var 1
        var var2 = //some logic to build var 2
        SomeMethodThatsAPainForUnitTesting(var1, var);
    }
}

По сути, я хочу проверить, как переменные var1 и var2 создаются правильно и передаются в SomeMethodThatsAPainForUnitTesting, поэтому, по сути, я хочу смоделировать защищенный метод, убедиться, что он был вызван хотя бы один раз и что все параметры прошло правильно. Если бы это вызывало метод в интерфейсе, это было бы тривиально, но я отклеил защищенный метод.

Я не могу легко изменить дизайн, так как это разработка коричневого поля, и я не единственный класс, вызывающий метод.

1 Ответ

1 голос
/ 11 октября 2010

Нет, это невозможно.

Такие инструменты, как Moq и Rhino mocks, творят свою магию, генерируя подклассы типов, которые вы хотите макетировать во время выполнения. Они генерируют всю свою логику «Проверка» и «Ожидание», переопределяя элемент (в случае виртуальных элементов) или реализуя его (в случае интерфейса), и вставляя код для проверки или записи переданных аргументов и возврата предварительно законсервированный ответ.

Так что вы можете сделать, чтобы обойти это? Во-первых, если бы вы могли изменить базовый метод, чтобы он был виртуальным, то это позволило бы вам протестировать свой метод, создав тестовый набор, подобный следующему: -

class ClassIWantToTestHarness : ClassIWantToTest {
    public string Arg1 { get; set; }
    public string Arg2 { get; set; }
    public int CallCount { get; set; }

    protected override void SomeMethodThatsAPainForUnitTesting(var1, var2) {
        Arg1 = var1;
        Arg2 = var2;
            CallCount++;
    }
}

[Test]
public void ClassIWantToTest_DoesWhatItsSupposedToDo() {
    var harness = new ClassIWantToTestHarness();
    harness.IWantToTestThisMethod();
    Assert.AreEqual("Whatever", harness.Arg1);
    Assert.AreEqual("It should be", harness.Arg2);
    Assert.IsGreaterThan(0, harness.CallCount);
}

Если вообще невозможно изменить базовый класс из-за того, что код настолько ужасен, что вы не хотите испачкать свои ботинки, вы можете просто обернуть метод в ClassIWantToTest как защищенный виртуальный метод и выполнить то же самое обмануть это вместо этого. В Moq есть поддержка переопределения защищенных виртуальных элементов (см. Раздел здесь ) - хотя лично я предпочитаю использовать тестовые наборы вручную в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...