Я забыл бы о окурки здесь. Stubs/mocks предназначены, когда вы хотите подделать поведение зависимости. Вы бы окурок ваш SomeClass если было SomeClassClient, что вы хотели, чтобы проверить и использовали SomeClass:
public class Foo
{
public virtual int GetFoosInt()
{
return 12;
}
}
public class FooClient
{
private Foo _foo;
public FooClient(Foo foo)
{
_foo = foo;
}
public int AddOneToFoosInt()
{
return _foo.GetFoosInt() + 1;
}
}
В этом примере, при тестировании FooClient, что вы хотите, чтобы проверить, что она возвращает более чем один «GetFoosInt() ». На самом деле вам неинтересно, что FoosInt предназначен для тестирования FooClient. Таким образом, вы создаете заглушку Foo, где вы можете настроить GetFoosInt, чтобы вернуть все, что хотите.
В вашем случае, тестирование защищенного виртуального члена, я бы с этим:
[TestClass]
public class SomeClassTest
{
private class DummySomeClass : SomeClass
{
public bool IsHappyWrapper(string mood)
{
return IsHappy(mood);
}
}
[TestMethod]
public void SomeTest()
{
var myClass = new DummySomeClass();
Assert.IsTrue(myClass.IsHappyWrapper("Happy"));
}
}
Это дает «прямой» доступ к защищаемой виртуальной, чтобы проверить поведение по умолчанию. Единственное предостережение в том, что если вы начнете определять абстрактных членов и добавляете в SomeClass в целом, вам также придется добавить их к этому фиктивному наследнику, добавив к тестированию накладные расходы на техническое обслуживание.
Пурист во мне говорит, что вы должны оставить защищенных членов самостоятельно и протестировать их только через публичный интерфейс. Но это может быть или не быть практичным в вашей ситуации, и я действительно не вижу никакого вреда в этом подходе.
Метод IsHappy является «защищенным». Я не могу получить к нему доступ, вызывая метод непосредственно из теста класса. – Ian
@Ian: Извините, так долго требовалось, чтобы вернуться к этому. Обновлен мой ответ –