Estoy usando Lokad Shared Library para definir reglas de validación de negocios. He aquí cómo pruebo casos de esquina (muestra de la fuente abierta):
[Test]
public void Test()
{
ShouldPass("[email protected]", "pwd", "http://ws.lokad.com/TimeSerieS2.asmx");
ShouldPass("[email protected]", "pwd", "http://127.0.0.1/TimeSerieS2.asmx");
ShouldPass("[email protected]", "pwd", "http://sandbox-ws.lokad.com/TimeSerieS2.asmx");
ShouldFail("invalid", "pwd", "http://ws.lokad.com/TimeSerieS.asmx");
ShouldFail("[email protected]", "pwd", "http://identity-theift.com/TimeSerieS2.asmx");
}
static void ShouldFail(string username, string pwd, string url)
{
try
{
ShouldPass(username, pwd, url);
Assert.Fail("Expected {0}", typeof (RuleException).Name);
}
catch (RuleException)
{
}
}
static void ShouldPass(string username, string pwd, string url)
{
var connection = new ServiceConnection(username, pwd, new Uri(url));
Enforce.That(connection, ApiRules.ValidConnection);
}
Dónde regla ValidConnection se define como:
public static void ValidConnection(ServiceConnection connection, IScope scope)
{
scope.Validate(connection.Username, "UserName", StringIs.Limited(6, 256), StringIs.ValidEmail);
scope.Validate(connection.Password, "Password", StringIs.Limited(1, 256));
scope.Validate(connection.Endpoint, "Endpoint", Endpoint);
}
static void Endpoint(Uri obj, IScope scope)
{
var local = obj.LocalPath.ToLowerInvariant();
if (local == "/timeseries.asmx")
{
scope.Error("Please, use TimeSeries2.asmx");
}
else if (local != "/timeseries2.asmx")
{
scope.Error("Unsupported local address '{0}'", local);
}
if (!obj.IsLoopback)
{
var host = obj.Host.ToLowerInvariant();
if ((host != "ws.lokad.com") && (host != "sandbox-ws.lokad.com"))
scope.Error("Unknown host '{0}'", host);
}
Si se descubre algún caso en su defecto (es decir: la nueva URL de conexión válida es agregado), entonces la regla y la prueba se actualizan.
Más sobre este patrón se puede encontrar en this article. Todo es de código abierto, así que siéntase libre de reutilizar o hacer preguntas.
PS: en cuenta que reglas primitivas utilizados en esta regla compuesto de la muestra (es decir StringIs.ValidEmail o StringIs.Limited) se prueban a fondo en su propia y por lo tanto no necesita unidad excesivo pruebas.
He reformulado mi pregunta un poco - por favor lea de nuevo – JacobE