Для этого вам не нужно издеваться. Вы используете издевательство, когда два класса работают вместе, и вы хотите заменить один класс на ложный (поддельный), так что вам нужно только проверить другой.В вашем примере это не так.
Однако есть способ использовать макеты, и это устранит проблему с экземплярами на 2 млрд. Если вы отделите генерацию идентификатора от Primitive
класс и использовать генератор, вы можете издеваться над генератором.Пример:
Я изменил Primitive
, чтобы использовать предоставленный генератор.В этом случае для него задана статическая переменная, и существуют более эффективные способы, но в качестве примера:
public abstract class Primitive
{
internal static IPrimitiveIDGenerator Generator;
protected Primitive()
{
Id = Generator.GetNext();
}
internal int Id { get; private set; }
}
public interface IPrimitiveIDGenerator
{
int GetNext();
}
public class PrimitiveIDGenerator : IPrimitiveIDGenerator
{
private int? _previousId;
public int GetNext()
{
try
{
_previousId = checked(++_previousId) ?? 0;
return _previousId.Value;
}
catch (OverflowException ex)
{
throw new OverflowException("Cannot instantiate more than (int.MaxValue) unique primitives.", ex);
}
}
}
Тогда ваш тестовый пример станет:
[Fact(DisplayName = "Test Primitive count limit")]
public void TestPrimitiveCountLimit()
{
Assert.Throws(typeof(OverflowException), delegate()
{
var generator = new PrimitiveIDGenerator();
for (; ; )
{
generator.GetNext();
}
});
}
Это запуститнамного быстрее, и теперь вы только проверяете, работает ли генератор идентификаторов.
Теперь, когда вы, например, хотите проверить, что создание нового примитива фактически запрашивает идентификатор, вы можете попробовать следующее:
public void Does_primitive_ask_for_an_ID()
{
var generator = new Mock<IPrimitiveIDGenerator>();
// Set the expectations on the mock so that it checks that
// GetNext is called. How depends on what mock framework you're using.
Primitive.Generator = generator;
new ChildOfPrimitive();
}
Теперь вы разделили различные проблемы и можете проверить их по отдельности.