Проблема в if choice in POSITIVES
. Ваша переменная choice
всегда указывает на строку "\nPlay again? Y/N: "
, и выбор, который предоставляет игрок, на самом деле никогда не «записывается».
Чтобы это исправить, вы должны
input(choice)
- то есть, player_choice = input(choice)
. if player_choice in POSITIVES
Когда я столкнулся с этим видом проблемы (где рассматриваемый класс не реализует интерфейс), я часто заканчиваю тем, что писал обертку со связанным интерфейсом вокруг рассматриваемого класса. Затем я использую свою обертку в моем коде. Для модульных тестов я вручаю насмешке обертку и вставляю мой собственный фиктивный объект в него.
Конечно, если платформа насмешки работает, то используйте ее вместо этого. Мой опыт состоит в том, что все платформы насмешки имеют некоторые проблемы с различными классами.NET.
public interface ICacheWrapper
{
...methods to support
}
public class CacheWrapper : ICacheWrapper
{
private System.Web.Caching.Cache cache;
public CacheWrapper( System.Web.Caching.Cache cache )
{
this.cache = cache;
}
... implement methods using cache ...
}
public class MockCacheWrapper : ICacheWrapper
{
private MockCache cache;
public MockCacheWrapper( MockCache cache )
{
this.cache = cache;
}
... implement methods using mock cache...
}
public class MockCache
{
... implement ways to set mock values and retrieve them...
}
[Test]
public void CachingTest()
{
... set up omitted...
ICacheWrapper wrapper = new MockCacheWrapper( new MockCache() );
CacheManager manager = new CacheManager( wrapper );
manager.Insert(item,value);
Assert.AreEqual( value, manager[item] );
}
Реальный код
...
CacheManager manager = new CacheManager( new CacheWrapper( HttpContext.Current.Cache ));
manager.Add(item,value);
...
Я думаю, что Ваш лучший выбор состоял бы в том, чтобы использовать фиктивный объект (изучите Насмешки Носорога).
Очень полезный инструмент для унаследованного кода поблочного тестирования является Изолятором TypeMock. Это позволит, Вы для обхода кэша возражаете полностью, говоря этому дразнить тот класс и любые вызовы метода, которые Вы находите проблематичными. В отличие от других ложных платформ, TypeMock использует отражение для прерывания тех вызовов метода, которые Вы говорите этому дразнить за Вас так, что Вы не должны иметь дело с громоздкими обертками.
TypeMock является коммерческим продуктом, но он имеет бесплатные версии для проектов с открытым исходным кодом. Они раньше имели "общественный" выпуск, который был однопользовательской лицензией, но я не знаю, предлагается ли это все еще.