Одним из возможных решений является использование шаблона Extract and Override для извлечения тестируемого класса из тестируемого класса и переопределения метода private
(который должен быть чем-то отличным от private
в вашем примере как метод private
не может быть virtual
- возможно, вы имели в виду protected
?), чтобы позволить вам переопределить метод.
public class Employee
{
public virtual string GetFullName(string firstName, string lastName)
{
string middleName = GetMiddleName();
return string.Format("{0} {2} {1}", firstName, lastName,middleName );
}
protected virtual string GetMiddleName()
{
// Some call to Service
return "George";
}
}
///<summary>
///Testable Employee class
///</summary>
public class TestableEmployee : Employee
{
public string MiddleName;
public virtual string GetFullName(string firstName, string lastName)
{
string middleName = GetMiddleName();
return string.Format("{0} {2} {1}", firstName, lastName,middleName );
}
protected override string GetMiddleName()
{
// provide own implementation to return
// property that we can set in the test method
return MiddleName;
}
}
метод испытания
[TestMethod]
public GetFullName_ReturnsSetName()
{
var testEmployee = new TestableEmployee();
string firstName = "first";
string middleName = "middle";
string lastName = "last";
TestableEmployee.MiddleName = middleName;
string fullName = GetFullName(firstName, lastName);
Assert.AreEqual(string.Format("{0} {2} {1}",
firstName, lastName, middleName ),
fullName
);
}
если GetMiddleName()
является оболочкой для вызова службы, то может быть более тестируемым, если интерфейс службы является свойством класса Employee
. Таким образом, вы можете смоделировать тип службы, используя шаблон извлечения и переопределения или контейнер Inover of Control (IoC), такой как Unity или Castle Windsor .