Me preguntaba si el objeto a probar debería ser un campo y configurarlo así durante un método SetUp
(es decir, JUnit, nUnit, MS Test, ...).¿Inicializar objeto para probar en SetUp o durante el método de prueba?
Considere los siguientes ejemplos (esto es C♯ con MSTEST, pero la idea debe ser similar para cualquier otro idioma y el marco de pruebas):
public class SomeStuff
{
public string Value { get; private set; }
public SomeStuff(string value)
{
this.Value = value;
}
}
[TestClass]
public class SomeStuffTestWithSetUp
{
private string value;
private SomeStuff someStuff;
[TestInitialize]
public void MyTestInitialize()
{
this.value = Guid.NewGuid().ToString();
this.someStuff = new SomeStuff(this.value);
}
[TestCleanup]
public void MyTestCleanup()
{
this.someStuff = null;
this.value = string.Empty;
}
[TestMethod]
public void TestGetValue()
{
Assert.AreEqual(this.value, this.someStuff.Value);
}
}
[TestClass]
public class SomeStuffTestWithoutSetup
{
[TestMethod]
public void TestGetValue()
{
string value = Guid.NewGuid().ToString();
SomeStuff someStuff = new SomeStuff(value);
Assert.AreEqual(value, someStuff.Value);
}
}
Por supuesto, con sólo un método de ensayo, el primer ejemplo es demasiado largo, pero con más métodos de prueba, esto podría ser bastante seguro de algún código redundante.
¿Cuáles son los pros y los contras de cada enfoque? ¿Hay alguna "mejores prácticas"?
Sí, cambiar a ese estilo de prueba realmente ha ayudado con cómo van las cosas. Básicamente, las pruebas unitarias siguen la misma regla que el código: es decir, responsabilidad única. Una prueba para un escenerio. –