Spesso lavoro con classi che rappresentano entità prodotte da una fabbrica. Per abilitare facilmente il test delle mie fabbriche, di solito implemento lo IEquatable<T>
, pur sovrascrivendo GetHashCode
e Equals
(come suggerito dallo MSDN).Dovrei usare IEquatable per facilitare il test delle fabbriche?
Ad esempio; prendere la seguente classe di entità che è semplificata, ad esempio. In genere le mie classi hanno molte più proprietà. Occasionalmente c'è anche una collezione, che nel metodo Equals
controllo usando SequenceEqual
.
public class Product : IEquatable<Product>
{
public string Name
{
get;
private set;
}
public Product(string name)
{
Name = name;
}
public override bool Equals(object obj)
{
if (obj == null)
{
return false;
}
Product product = obj as Product;
if (product == null)
{
return false;
}
else
{
return Equals(product);
}
}
public bool Equals(Product other)
{
return Name == other.Name;
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
}
Questo significa che può quindi eseguire unit test semplici in questo modo (supponendo che il costruttore viene testato altrove).
[TestMethod]
public void TestFactory()
{
Product expected = new Product("James");
Product actual = ProductFactory.BuildJames();
Assert.AreEqual(expected, actual);
}
Tuttavia questo solleva una serie di domande.
GetHashCode
non viene effettivamente utilizzato, ma ho impiegato del tempo per implementarlo.- In realtà raramente desidero utilizzare
Equals
nella mia applicazione effettiva oltre il test. - Trascorro più tempo a scrivere altri test per garantire che lo
Equals
funzioni correttamente. - Ora ho altri tre metodi da mantenere, ad es. aggiungi una proprietà alla classe, aggiorna i metodi.
Ma questo mi dà un ottimo TestMethod
.
Si tratta di un uso appropriato di IEquatable
o devo fare un altro approccio?
L'utilizzo di IEquatable è certamente inappropriato perché non esiste una sola nozione di uguaglianza per un prodotto. Ma potresti usare un "IEqualityComparer" che Resharper può anche generare per te. Ed è una scelta se testare un simile comparatore generato. – usr
GetHashCode basato sul campo mutabile è una cattiva idea http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx –