Как проверить метод в абстрактном классе с помощью абстрактных методов? - PullRequest
1 голос
/ 31 августа 2010

Необходимо проверить реализацию виртуального метода «MyMethod» в абстрактном «MyAbstractClass»:

public abstract MyAbstractClass
{
    public void MyMethod()
    {
        Testpassed = true;
    }

    public abstract int StatusCode{get;internal set;} // **EDIT**: internal setter was added

    public bool TestPassed{get;private set;}
}

Я пытался сделать следующее:

[TestMethod()]
{
    Mock<MyAbstractClass> mockClass = new Mock<MyAbstractClass>();
    mockClass.Object.MyMethod();
    Assert.IsTrue(mockClass.Object.TestPassed);
}

вПри попытке выполнить «MyMethod» генерируется следующая ошибка:

Метод «set_StatusCode» в типе «MyAbstractClass`2Proxy0434d60c0f4542fb9b4667ead4ca3a18» из сборки «DynamicProxyGenAssembly2, версия = 0.0.0.0 = 0.0.0.0.0)'не имеет реализации ..

Посоветуйте, пожалуйста, как мне решить проблему?

Большое спасибо!

PS На самом деле я мог унаследоватьиз MyAbstractClass и предоставить реализацию для свойства StatusCode, но у меня есть несколько свойств, которые необходимо реализовать ...

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

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

Я бы также предостерег от использования тестовой логики в классе. Если единственная цель TestPassed - это тестирование, то оно определенно не относится к этому. Мы могли бы помочь намного больше, если вы разместите реальный код.

1 голос
/ 31 августа 2010

См. этот ответ о частичной насмешке, и я думаю, вам придется предоставить конкретную реализацию.

1 голос
/ 31 августа 2010

Я понимаю, что это не ответ на ваш вопрос moq, но в любом случае.Даже если у вас много абстрактных свойств, VS делает чрезвычайно простым добавление пустых (на самом деле, бросающих) реализаций.Таким образом, если MyMethod не зависит от этих свойств по своей конструкции, я бы добавил пустой производный класс и протестировал бы его.

...