Я полностью перешел от классического подхода к TDD к более современному и логичному BDD (Behavior Driven Design). В случае вашего класса Number я написал бы следующие спецификации BDD (обратите внимание, что приведенный ниже синтаксис сделан с SubSpec , который основан на xUnit.NET ):
public void Parameterless_constructor_initializes_all_defaults_properly()
{
// State
Number number = null;
// Context
"Given a null context".Context(() => {});
// Concern
"when creating a new Number with no parameters".Do(() => { number = new Number(); });
// Observations
"the Value property should contain the default value 0".Assert(() => Assert.Equal(0, number.value));
"the MinValue property should be 0".Assert(() => Assert.Equal(0, number.MinValue));
"the MaxValue property should be 100".Assert(() => Assert.Equal(100, number.MaxValue));
}
public void Single_parameter_constructor_initializes_all_defaults_and_initial_value_properly()
{
// State
Number number = null;
// Context
"Given a null context".Context(() => {});
// Concern
"when creating a new Number with the initial value".Do(() => { number = new Number(10); });
// Observations
"the Value property should contain the value 10".Assert(() => Assert.Equal(10, number.value));
"the MinValue property should be 0".Assert(() => Assert.Equal(0, number.MinValue));
"the MaxValue property should be 100".Assert(() => Assert.Equal(100, number.MaxValue));
}
public void Full_constructor_initializes_all_values_properly()
{
// State
Number number = null;
// Context
"Given a null context".Context(() => {});
// Concern
"when creating a new Number with the initial, min, and max values".Do(() => { number = new Number(10, 1, 50); });
// Observations
"the Value property should contain the value 10".Assert(() => Assert.Equal(10, number.value));
"the MinValue property should be 1".Assert(() => Assert.Equal(1, number.MinValue));
"the MaxValue property should be 50".Assert(() => Assert.Equal(50, number.MaxValue));
}
Кроме того, я заметил, что у вас также есть возможный исключительный сценарий для вашего полного конструктора, когда минимальное значение больше максимального значения. Вы также хотели бы проверить правильное поведение в этом исключительном случае:
public void Full_constructor_throws_proper_exception_when_minvalue_greater_than_maxvalue()
{
// State
Number number = null;
Exception expectedEx = null;
// Context
"Given a null context".Context(() => {});
// Concern
"when creating a new Number with inverted min and max values".Do(
() =>
{
try { number = new Number(10, 50, 1); }
catch (Exception ex) { expectedEx = ex }
}
);
// Observations
"an exception should be thrown".Assert(() => Assert.NotNull(expectedEx));
"the exception should be an ArgumentException".Assert(() => Assert.IsType<ArgumentException>(expectedEx));
}
Приведенные выше характеристики должны дать вам 100% тестовое покрытие. Они также создают очень хороший, понятный человеку логический отчет при выполнении с xunit.net и выводят отчет по умолчанию.